Gibt die eindeutige Kennung zurück, die beim Einfügen standardmäßig generiert wurde

8

Tor

Rufen Sie den neuesten Richtwert in Echtzeit ab, nachdem Sie den Wert in die Tabelle eingefügt haben

Problem

Ich weiß nicht, wie es geht

Die Info

  • Der Code sollte nur neue Werte für Adresse und Postleitzahl angeben
  • Die Tabelle kann viele Daten enthalten

Tabelle

CREATE TABLE [AddressBook]
(
    [testID] [uniqueidentifier] NOT NULL default newid(),
    [address] [nvarchar](50) NULL,
    [zipcode] [nvarchar](50) NULL
)
KLN
quelle
1
Ich würde vorschlagen, NEWSEQUENTIALID () anstelle von NEWID () zu verwenden, da sonst Ihr Clustered-Index (vorausgesetzt, er wird auf testID sein) stark fragmentiert wird.
Jonathan Fite

Antworten:

13

Ich denke, Sie suchen nach Ausgabe

DECLARE @MyTableVar table([testID] [uniqueidentifier]);
 INSERT [AddressBook] ([address], [zipcode])
        OUTPUT INSERTED.[testID] INTO @MyTableVar
 VALUES (N'address', N'zipcode');

--Display the result set of the table variable.
 SELECT [testID] FROM @MyTableVar;

GO

Die eindeutige Kennung ist hier möglicherweise nicht die effizienteste ID, dies ist jedoch eine Antwort auf die angegebene Frage

Paparazzo
quelle
Beachten Sie, dass dies INSERTED.[testID]die Eigenschaft dessen ist, was Sie aus der Zeile möchten, nicht der Name der Eigenschaft in@MyTableVar
smurtagh
-1
CREATE TABLE [dbo].[tbl_Clients](
    [ClientID] [uniqueidentifier] NULL,
    [ClientName] [varchar](250) NULL,
    [ClientEnabled] [bit] NULL
) ON [PRIMARY]

GO

CREATE PROCEDURE [dbo].[sp_ClientCreate]
@in_ClientName varchar(250) = "New Client 123",
@in_ClientEnabled bit,
@out_ClientId uniqueidentifier OUTPUT
AS

SET @out_ClientId = NEWID();

INSERT
INTO tbl_Clients(ClientId, ClientName, ClientEnabled) 
VALUES(
@out_ClientId, 
@in_ClientName,
@in_ClientEnabled)


DECLARE @return_value int,
        @out_ClientId uniqueidentifier

EXEC    @return_value = [dbo].[sp_ClientCreate]
        @in_ClientName = N'111',
        @in_ClientEnabled = 1,
        @out_ClientId = @out_ClientId OUTPUT

SELECT  @out_ClientId as N'@out_ClientId'

SELECT  'Return Value' = @return_value

GO 

Ergebnis: -59A6D7FE-8C9A-4ED3-8FC6-31A989CCC8DB

AJIT AGARWAL
quelle
In der Frage wird gefragt, wie der durch die Standardeinschränkung generierte Wert abgerufen werden soll. Dies beantwortet diese Frage nicht, obwohl es eine Problemumgehung bietet
Max Vernon
-4

Im Allgemeinen gibt es zwei verschiedene Möglichkeiten, um nach dem Einfügen einen Identitätswert zu erhalten, indem Sie SQL SERVER SCOPE_IDENTITY / IDENT_CURRENT / @@ IDENTITY oder SQL SERVER OUTPUT verwenden .

  1. SQL SERVER SCOPE_IDENTITY / IDENT_CURRENT / @@ IDENTITY. Während SCOPE_IDENTITY / IDENT_CURRENT / @@ IDENTITY ähnliche Funktionen ausführen, unterscheiden sich die von jedem zurückgegebenen Werte je nach aktuellem Bereich, z. B. gespeicherte Prozedur, Trigger, Batch. Die Dokumentation sollte gelesen und verstanden werden, bevor festgelegt wird, welche verwendet werden soll.

    CREATE TABLE Test (TestID INT IDENTITY (1,1), TestName VARCHAR (20) NICHT NULL)

    INSERT TEST VALUES ('Test1', 'Test2', 'Test3'); SELECT @@ IDENTITY, SCOPE_IDENTIY ();

    In diesem Beispiel geben beide @@ IDENTITY, SCOPE_IDENTIY () 3 zurück, da sie sich im selben Bereich befinden. Je nach Umfang können sie jedoch unterschiedliche Werte zurückgeben.

  2. Mit der SQL SERVER-Ausgabe können Sie auf alle Zeilen zugreifen, die von einer INSERT / DELETE / UPDATE- oder Merge-Anweisung zurückgegeben wurden. Möglicherweise müssen Sie eine Variable verwenden, um auf die Identität zuzugreifen. Die Links bieten umfassendere Informationen.

Armitage
quelle
Während SCOPE_IDENTITY()etc für identity()Spalten funktioniert, funktioniert es nicht für uniqueidentifierSpalten mit einer newid()oder einer newsequentialid()Standardbeschränkung.
Max Vernon
-4

Ein anderer Weg,

DECLARE @id varchar(50) = CONVERT(VARCHAR(50), NEWID());

INSERT INTO [yourtable]
( [id])
VALUES
(@id);

SELECT @id;
Shanna
quelle
In der Frage wird gefragt, wie der durch die defaultEinschränkung generierte Wert abgerufen werden soll. Dies beantwortet diese Frage nicht, obwohl es eine Problemumgehung bietet.
Max Vernon