Avatar billede muncken Nybegynder
03. november 2004 - 11:27 Der er 7 kommentarer

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?

Tak
Avatar billede fsconsult.dk Nybegynder
03. november 2004 - 11:35 #1
prøv:

SELECT @@IDENTITY
Avatar billede muncken Nybegynder
03. november 2004 - 11:45 #2
Den har jeg prøvet - virker ligesom scope_identity (bare også uden for det scope (fx. stored prodedure) man er i)...
Avatar billede arne_v Ekspert
03. november 2004 - 11:50 #3
Du er nødt til at assigne @@IDENTITY eller SCOPE_IDENTITY() over i en
variabel efter hver INSERT for at bevare dem.
Avatar billede muncken Nybegynder
03. november 2004 - 12:08 #4
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)
Avatar billede arne_v Ekspert
03. november 2004 - 16:50 #5
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
Avatar billede muncken Nybegynder
03. november 2004 - 17:37 #6
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). 

Men rigtig mange tak for svarene :-)

CREATE PROCEDURE [dbo].[sp_Port2Insert]

@fingeraftryk int= null,
@teknikerID int= null

AS

declare @portGUID uniqueidentifier
select @portGUID=newid()

-- 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...
Avatar billede arne_v Ekspert
03. november 2004 - 20:42 #7
Ah.

Du bruger INSERT SELECT. Så kan jeg godt se problemet.

Jeg troede at du brugte CURSOR.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester