92 votes

SQL Server - SCOPE_IDENTITY() pour les Guid?

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

Je ne veux pas créer le GUID de la première et l'enregistrer comme une variable que nous utilisons séquentielle Guid comme nos clés primaires.

Aucune idée de ce qu'est la meilleure façon de récupérer la dernière inséré GUID de la clé primaire.

Merci à l'avance!

96voto

Rob Garrison Points 2977

Vous pouvez obtenir le GUID par la production. Cela fonctionne lorsque vous êtes à l'insertion de 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: Explorer SQL 2005 SORTIE de la Clause

59voto

Daniel Points 211

Il n'y a pas de SCOPE_IDENTITY() équivalent lors de l'utilisation de Guid comme clés primaires, mais vous pouvez utiliser la clause OUTPUT pour obtenir un résultat semblable. Vous n'avez pas besoin d'utiliser un tableau de variable de 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 voulez lire la valeur de un .Net client. La lecture de la valeur de .Net vous suffit d'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();
...

8voto

anishMarokey Points 6895

vous souhaitez utiliser la fonction NEWID()

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

    select @id

mais l'index cluster problème, y-a GUID . lire un tropNEWSEQUENTIALID() .Ce sont mes idées ,réfléchir avant d'utiliser GUID comme Clé primaire . :)

3voto

Joe Points 21
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;

2voto

TravisWhidden Points 591

À l'aide de ce fil comme une ressource, j'ai créé le suivant: pour une utilisation au sein d'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;

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X