Czy ktoś może mi powiedzieć, czy istnieje odpowiednik SCOPE_IDENTITY()
używania identyfikatorów GUID jako klucza podstawowego w programie SQL Server?
Nie chcę najpierw tworzyć identyfikatora GUID i zapisywać go jako zmienną, ponieważ używamy sekwencyjnych identyfikatorów GUID jako naszych kluczy podstawowych.
Masz pomysł na najlepszy sposób na pobranie ostatnio wstawionego klucza podstawowego GUID?
OUTPUT
Klauzula daje błąd na każdym stole, który ma wyzwalacz insert dołączony.Nie ma odpowiednika SCOPE_IDENTITY () w przypadku używania identyfikatorów GUID jako kluczy podstawowych, ale można użyć klauzuli OUTPUT, aby osiągnąć podobny wynik. Nie musisz używać zmiennej tabeli do wyjścia.
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(); ...
źródło
chcesz użyć NEWID ()
declare @id uniqueidentifier set @id = NEWID() INSERT INTO [dbo].[tbl1] ([id]) VALUES (@id) select @id
ale problem z indeksem klastrowym istnieje w identyfikatorze GUID. przeczytaj też ten NEWSEQUENTIALID () .To są moje pomysły, zastanów się, zanim użyjesz GUID jako głównego klucza . :)
źródło
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;
źródło
Używając tego wątku jako zasobu, utworzyłem następujące elementy do użycia w wyzwalaczu:
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ś innemu zrobić to samo. Ciekawe, czy ktoś ma do powiedzenia coś złego pod względem wydajności, czy to nie jest dobry pomysł, czy nie.
źródło