sql sql-server guid uniqueidentifier scope-identity

sql - SCOPE_IDENTITY() para GUIDs?



sql-server uniqueidentifier (5)

¿Alguien puede decirme si hay un equivalente de SCOPE_IDENTITY() al usar GUID como clave principal en SQL Server?

No quiero crear primero el GUID y guardar como una variable ya que estamos usando GUID secuenciales como nuestras claves principales.

¿Alguna idea sobre cuál es la mejor forma de recuperar la última clave primaria GUID insertada?


Al utilizar este hilo como recurso, creé lo siguiente para utilizarlo en un desencadenante:

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;

Podría ayudar a alguien más a hacer lo mismo. Es curioso si alguien tiene algo malo que decir respecto al rendimiento si no es una buena idea o no.


No hay equivalente SCOPE_IDENTITY () cuando se usan GUID como claves principales, pero puede usar la cláusula OUTPUT para lograr un resultado similar. No necesita usar una variable de tabla para la salida.

CREATE TABLE dbo.GuidTest ( GuidColumn uniqueidentifier NOT NULL DEFAULT NewSequentialID(), IntColumn int NOT NULL ) GO INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)

El ejemplo anterior es útil si desea leer el valor de un cliente .Net. Para leer el valor de .Net, simplemente usaría el método ExecuteScalar.

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


Puede recuperar el GUID utilizando OUTPUT. Esto funciona cuando también está insertando varios registros.

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

Referencia: Exploración de la cláusula OUTPUT de SQL 2005


quieres usar NEWID ()

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

pero el problema del índice agrupado está ahí en GUID. lea esto también NEWSEQUENTIALID() . Estas son mis ideas, piense antes de usar GUID como clave principal . :)


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;