2009-10-02 14 views
80

Kann mir jemand sagen, ob es ein Äquivalent von SCOPE_IDENTITY() bei der Verwendung von GUIDs als Primärschlüssel in SQL Server gibt?SCOPE_IDENTITY() für GUIDs?

Ich möchte die GUID nicht zuerst erstellen und als eine Variable speichern, da wir sequentielle GUIDs als unsere primären Schlüssel verwenden.

Gibt es eine Idee, wie der zuletzt eingefügte GUID-Primärschlüssel am besten abgerufen werden kann?

Antwort

6

Sie NEWID verwenden()

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

    select @id 

aber gruppierten Index Problem gibt es in GUID. Lesen Sie auch dieses NEWSEQUENTIALID() .Dies sind meine Ideen, denke vor Gebrauch GUID als primary Key. :)

+0

+1 für NEWSEQUENTIALID –

+5

"Die neue integrierte Funktion newsesequentalid() kann nur in einem DEFAULT-Ausdruck für eine Spalte vom Typ 'uniqueidentifier' in einer Anweisung CREATE TABLE oder ALTER TABLE verwendet werden. Sie kann nicht mit anderen Operatoren kombiniert werden einen komplexen skalaren Ausdruck bilden. " –

82

Sie können die GUID zurück erhalten, indem Sie OUTPUT verwenden. Dies funktioniert auch, wenn Sie mehrere Datensätze einfügen.

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 

Referenz: Exploring SQL 2005’s OUTPUT Clause

+1

Wie anishmarokey erwähnt, sollten Sie NewSequentialID() verwenden, um Ihre GUIDs und nicht NewID() zu generieren. –

+0

Danke, ich hatte keine Ahnung von dieser Syntax – 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

Es gibt keine SCOPE_IDENTITY() äquivalent, wenn GUIDs als Primärschlüssel verwenden, aber Sie können die OUTPUT-Klausel verwenden, um ein ähnliches Ergebnis zu erzielen. Sie müssen keine Tabellenvariable für die Ausgabe verwenden.

Das obige Beispiel ist nützlich, wenn Sie den Wert von einem .Net-Client lesen möchten. Um den Wert von .Net zu lesen, verwenden Sie einfach die ExecuteScalar-Methode.

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

dieses Themas als Ressource verwenden, habe ich die folgenden für die Verwendung innerhalb eines Triggers:

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; 

helfen könnte jemand anderes das gleiche tun. Neugierig, wenn jemand etwas Schlechtes zu sagen hat, wenn es keine gute Idee ist oder nicht.

+0

nach erneutem Lesen der Frage, erkannte ich, dass dies wirklich nicht beantwortet die Frage des Benutzers ... aber immer noch hilfreich für jemanden sein könnte, weil die ähnlichen Antworten die gleiche Art von Antwort sind. – TravisWhidden