MS SQL - hvordan får man returneret autogenererede IDs
Jeg skal, i en stored procedure i MS SQL, indsætte nogle rækker i en tabel med autogenereret ID og har efterfølgende brug for ID'erne på de rækker der er blevet indsat (jeg skal relatere rækkerne til en anden tabel). Jeg ved at man kan bruge scope_identity() til at få det sidst indsatte ID, men hvad når der er flere?
De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
Ja - men hvordan gør jeg det? Problemet er, at jeg skal kopiere nogle rækker i en tabel til en tabel med autogereret ID. Hvis jeg starter med at SELECT'e de rækker jeg skal bruge, kan jeg så lave en løkke som indsætter rækkerne i tabellen med autogenereret ID én efter én? (det skal kunne gøres i en stored procedure i MS SQL)
Umiddelbart lyder det nærliggende at lave en temporær tabel, efter hver INSERT assigne @@IDENTITY over i en variabel og INSERT'e den i den temporære tabel, til sidst laver du så bare en SELECT * FROM den temorære tabel der returnerer et result set til kalderen
Men hvordan "stopper" man efter hvert insert og kalder @@identity? Så skal insert vel sættes ind en løkke og det kan jeg ikke få til at virke i MS SQL?
Jeg forsøger mig nu med en lidt grim løsning, hvor jeg laver en ekstra kolonne (guid)i tabellen af typen uniquiidentifier. Når jeg indsætter nogle rækker laver jeg først en variabel @guid = NEWID som jeg lægger i guid. Så kan jeg bagefter hente alle de rækker der har guid=@guid og få deres autogenererede IDs....(lidt grimt men det virker). Jeg har klippet den ind nedenfor. (eksemplet er forenklet da det indgik i en større operation, så det virker måske lidt mærkeligt - i virkeligheden er det ikke teknikere portene skal relateres til).
-- indsæt alle porte i Port der er i stykker, ind i Port2 INSERT INTO Port (guid,fingeraftryk, stamp, porttypenavn, portnr, trunknr, hastighed, statusnavn, powerdb, managementport) SELECT @portGUID, @fingeraftryk, getDate(), porttypenavn, portnr , trunknr, hastighed, statusnavn, powerdb, managementport FROM Port2 WHERE Port2.statusnavn = 'broken'
--relater portene til den tekniker der er skal se på dem. --(portID er det eneste der hentes fra Port vha. guid. Resten er variable) insert into Tekniker_Port (fingeraftryk, stamp, teknikerID, portID) select @fingeraftryk, getDate(), @teknikerID, portID from Port where Port.guid= @portGUID
GO
Til sidst kan man evt. slette guid så det ikke optager plad i databasen...
Du bruger INSERT SELECT. Så kan jeg godt se problemet.
Jeg troede at du brugte CURSOR.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.