2009-10-02 22 views
80

Czy ktoś może mi powiedzieć, czy istnieje odpowiednik SCOPE_IDENTITY() podczas korzystania z identyfikatorów GUID jako klucz podstawowy w SQL Server?SCOPE_IDENTITY() dla identyfikatorów GUID?

Nie chcę najpierw tworzyć identyfikatora GUID i zapisywać jako zmiennej, ponieważ używamy sekwencyjnych identyfikatorów GUID jako naszych kluczy podstawowych.

Każdy pomysł na najlepszy sposób na pobranie ostatnio wstawionego klucza podstawowego GUID?

Odpowiedz

6

chcesz użyć newID()

declare @id uniqueidentifier 
    set @id = NEWID() 
    INSERT INTO [dbo].[tbl1] 
      ([id]) 
    VALUES 
      (@id) 

    select @id 

ale skupione Problem Indeks istnieją w GUID. przeczytaj ten też NEWSEQUENTIALID(). To są moje pomysły, pomyśl przed użyciem GUID jako primary Key. :)

+0

+1 dla NEWSEQUENTIALID –

+5

"Funkcja wbudowana newsequentialid() może być używana tylko w wyrażeniu DEFAULT dla kolumny typu 'uniqueidentifier' w instrukcji CREATE TABLE lub ALTER TABLE.Nie można jej łączyć z innymi operatorami tworzą złożoną, skalarną ekspresję. " –

82

Możesz odzyskać GUID, używając OUTPUT. Działa to również w przypadku wstawiania wielu rekordów.

CREATE TABLE dbo.GuidPk (
    ColGuid uniqueidentifier NOT NULL DEFAULT NewSequentialID(), 
    Col2 int    NOT NULL 
) 
GO 

DECLARE @op TABLE (
    ColGuid uniqueidentifier 
) 

INSERT INTO dbo.GuidPk (
    Col2 
) 
OUTPUT inserted.ColGuid 
INTO @op 
VALUES (1) 

SELECT * FROM @op 

SELECT * FROM dbo.GuidPk 

referencyjny: Exploring SQL 2005’s OUTPUT Clause

+1

Jak wspomina anishmarokey, powinieneś używać NewSequentialID() do generowania identyfikatorów GUID, a nie NewID(). –

+0

Dzięki, nie miałem pojęcia o tej składni – cmsjr

3
CREATE TABLE TestTable(KEY uniqueidentifier, ID VARCHAR(100), Name VARCHAR(100), Value tinyint); 
Declare @id uniqueidentifier ; 
DECLARE @TmpTable TABLE (KEY uniqueidentifier);  
INSERT INTO [dbo].[TestTable] 
    ([ID], [Name], Value])   
    OUTPUT INSERTED.KEY INTO @TmpTable   
    VALUES(@ID, @Name, @Value);   
SELECT @uniqueidentifier = KEY FROM @TmpTable; 
DROP TABLE TestTable; 
47

Nie ma SCOPE_IDENTITY() równoważne przy użyciu GUID jak kluczy podstawowych, ale można skorzystać z klauzuli OUTPUT, aby osiągnąć podobny rezultat. Nie musisz używać zmiennej tabeli dla danych wyjściowych.

CREATE TABLE dbo.GuidTest (
    GuidColumn uniqueidentifier NOT NULL DEFAULT NewSequentialID(), 
    IntColumn int NOT NULL 
) 

GO 

INSERT INTO GuidTest(IntColumn) 
OUTPUT inserted.GuidColumn 
VALUES(1) 

Powyższy przykład jest przydatny, jeśli chcesz odczytać wartość z klienta .Net. Aby odczytać wartość z .Net, wystarczy użyć metody ExecuteScalar.

... 
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)"; 
SqlCommand cmd = new SqlCommand(sql, conn); 
Guid guid = (Guid)cmd.ExecuteScalar(); 
... 
0

Stosując ten wątek jako zasób, stworzyłem następujące do użytku wewnątrz wyzwalacza:

DECLARE @nextId uniqueIdentifier; 
DECLARE @tempTable TABLE(theKey uniqueIdentifier NOT NULL DEFAULT NewSequentialID(), b int); 
INSERT INTO @tempTable (b) Values(@b); 
SELECT @nextId = theKey from @tempTable; 

może pomóc komuś robić to samo innym. Ciekawe, jeśli ktoś ma coś złego do powiedzenia na temat wydajności, jeśli nie jest to dobry pomysł, czy nie.

+0

po ponownym przeczytaniu pytania, zrozumiałem, że to naprawdę nie odpowiada na pytanie użytkowników ... ale nadal może być pomocne dla kogoś, ponieważ podobne odpowiedzi są tego samego rodzaju odpowiedzi. – TravisWhidden