8

Ho letto this question per ottenere l'identità di una riga inserita. La mia domanda è in qualche modo correlata.Il modo migliore per ottenere PK Guid della riga inserita

C'è un modo per ottenere il guid per una riga inserita? La tabella con cui sto lavorando ha un guid come chiave primaria (di default a newid), e vorrei recuperare quel guid dopo aver inserito la riga.

C'è qualcosa come @@IDENTITY, IDENT_CURRENT o SCOPE_IDENTITY per Guids?

risposta

12

È possibile utilizzare la funzionalità OUTPUT per ripristinare i valori predefiniti in un parametro.

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @myNewPKTable TABLE (myNewPK UNIQUEIDENTIFIER) 

INSERT INTO 
    MyTable 
(
    MyColumn1, 
    MyColumn2 
) 
OUTPUT INSERTED.MyPK INTO @myNewPKTable 
VALUES 
(
    'MyValue1', 
    'MyValue2' 
) 

SELECT * FROM @myNewPKTable 

Devo dire però, fare attenzione utilizzando un identificatore univoco come chiave primaria. L'indicizzazione su un GUID è una prestazione estremamente scarsa poiché qualsiasi guids appena generato dovrà essere inserito nel mezzo di un indice e raramente aggiunto alla fine. C'è una nuova funzionalità in SQL2005 per NewSequentialId(). Se l'oscurità non è richiesta con i tuoi Guidi, allora è una possibile alternativa.

+0

Hi, grazie per il consiglio. Questo codice restituisce un errore "Devi dichiarare la variabile di tabella" @myNewPK "". Sembra che puoi produrre solo in un tavolo. Ho funzionato dichiarando una tabella temporanea e quindi selezionando l'id dalla tabella. Grazie per il tuo aiuto e il consiglio sulle scarse prestazioni di Guids. –

+0

Scusa, non l'avevo ancora provato, lo stavo solo buttando insieme da quello che ricordavo. Ora ho aggiornato la risposta con essa restituendo una variabile di tabella. –

+0

Molto bello, grazie Robin. Accettato :) –

1

altro approccio più pulito, se l'inserimento di una singola riga

CREATE TABLE MyTable 
(
    MyPK UNIQUEIDENTIFIER DEFAULT NEWID(), 
    MyColumn1 NVARCHAR(100), 
    MyColumn2 NVARCHAR(100) 
) 

DECLARE @MyID UNIQUEIDENTIFIER; 
SET @MyID = NEWID(); 

INSERT INTO 
    MyTable 
(
    MyPK 
    MyColumn1, 
    MyColumn2 
) 
VALUES 
(
    @MyID, 
    'MyValue1', 
    'MyValue2' 
) 

SELECT @MyID; 
Problemi correlati