web-dev-qa-db-fra.com

SCOPE_IDENTITY () pour les GUID?

Quelqu'un peut-il me dire s'il existe un équivalent de SCOPE_IDENTITY() lors de l'utilisation des GUID comme clé primaire dans SQL Server?

Je ne veux pas créer le GUID d'abord et l'enregistrer en tant que variable car nous utilisons des GUID séquentiels comme clés primaires.

Une idée de la meilleure façon de récupérer la dernière clé primaire insérée GUID?

91
bplus

Vous pouvez récupérer le GUID en utilisant OUTPUT. Cela fonctionne également lorsque vous insérez plusieurs enregistrements.

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

Référence: Exploration de la clause OUTPUT de SQL 2005

94
Rob Garrison

Il n'y a pas d'équivalent SCOPE_IDENTITY () lorsque vous utilisez des GUID comme clés primaires, mais vous pouvez utiliser la clause OUTPUT pour obtenir un résultat similaire. Vous n'avez pas besoin d'utiliser une variable de table pour la sortie.

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

GO

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

L'exemple ci-dessus est utile si vous souhaitez lire la valeur d'un client .Net. Pour lire la valeur de .Net, vous devez simplement utiliser la méthode ExecuteScalar.

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

vous souhaitez utiliser NEWID ()

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

    select @id

mais les problèmes d'index cluster sont là dans GUID. lisez celui-ci aussi NEWSEQUENTIALID () . Ce sont mes idées, réfléchissez avant d'utiliser GUID = comme clé primaire . :)

7
anishMarokey
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;
3
Joe

En utilisant ce fil comme ressource, j'ai créé ce qui suit pour une utilisation dans un déclencheur:

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;

Pourrait aider quelqu'un d'autre à faire la même chose. Curieux de savoir si quelqu'un a quelque chose de mauvais à dire en termes de performances, si ce n'est pas une bonne idée ou non.

1
TravisWhidden