Frage

Was ist der beste Weg, um dorthin zu gelangen? IDENTITY der eingefügten Zeile?

ich weiss Bescheid @@IDENTITY Und IDENT_CURRENT Und SCOPE_IDENTITY aber ich verstehe nicht die Vor- und Nachteile, die mit jedem verbunden sind.

Kann mir bitte jemand die Unterschiede erklären und erklären, wann ich sie jeweils verwenden sollte?

War es hilfreich?

Lösung

  • @@IDENTITY Gibt den letzten Identitätswert zurück, der für eine beliebige Tabelle in der aktuellen Sitzung über alle Bereiche hinweg generiert wurde. Hier ist Vorsicht geboten, da es bereichsübergreifend ist.Sie könnten anstelle Ihrer aktuellen Anweisung einen Wert von einem Trigger erhalten.

  • SCOPE_IDENTITY() gibt den letzten Identitätswert zurück, der für eine beliebige Tabelle in der aktuellen Sitzung und im aktuellen Bereich generiert wurde. Im Allgemeinen, was Sie verwenden möchten.

  • IDENT_CURRENT('tableName') gibt den letzten Identitätswert zurück, der für eine bestimmte Tabelle in einer beliebigen Sitzung und einem beliebigen Bereich generiert wurde.Auf diese Weise können Sie angeben, aus welcher Tabelle Sie den Wert erhalten möchten, falls die beiden oben genannten nicht ganz Ihren Anforderungen entsprechen (sehr selten).Ebenso wie @Guy Starbucks erwähnt: „Sie könnten dies verwenden, wenn Sie den aktuellen IDENTITY-Wert für eine Tabelle erhalten möchten, in die Sie keinen Datensatz eingefügt haben.“

  • Der OUTPUT Klausel des INSERT Mit der Anweisung können Sie auf jede Zeile zugreifen, die über diese Anweisung eingefügt wurde.Da es auf die spezifische Anweisung beschränkt ist, ist es direkter als die anderen oben genannten Funktionen.Allerdings ist es ein wenig ausführlicher (Sie müssen eine Tabellenvariable/eine temporäre Tabelle einfügen und diese dann abfragen) und es liefert Ergebnisse auch in einem Fehlerszenario, in dem die Anweisung zurückgesetzt wird.Wenn Ihre Abfrage jedoch einen parallelen Ausführungsplan verwendet, ist dies der Fall einzige garantierte Methode um die Identität zu erhalten (ohne die Parallelität auszuschalten).Es wird jedoch ausgeführt Vor Trigger und können nicht verwendet werden, um vom Trigger generierte Werte zurückzugeben.

Andere Tipps

Ich glaube, die sicherste und genaueste Methode zum Abrufen der eingefügten ID wäre die Verwendung der Ausgabeklausel.

zum Beispiel (entnommen aus dem Folgenden MSDN Artikel)

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

Ich sage das Gleiche wie die anderen, also haben alle Recht, ich versuche es nur klarer zu machen.

@@IDENTITY gibt die ID des letzten Objekts zurück, das durch die Verbindung Ihres Clients zur Datenbank eingefügt wurde.
Meistens funktioniert das gut, aber manchmal fügt ein Trigger eine neue Zeile ein, von der Sie nichts wissen, und Sie erhalten die ID aus dieser neuen Zeile anstelle der gewünschten

SCOPE_IDENTITY() löst dieses Problem.Es gibt die ID des letzten Dings zurück Du hast eingefügt im SQL-Code du hast geschickt zur Datenbank.Wenn Trigger zusätzliche Zeilen erstellen, wird nicht der falsche Wert zurückgegeben.Hurra

IDENT_CURRENT gibt die letzte ID zurück, die von irgendjemandem eingegeben wurde.Wenn eine andere App zu einem ungünstigen Zeitpunkt eine weitere Zeile einfügt, erhalten Sie die ID dieser Zeile anstelle Ihrer eigenen.

Wenn Sie auf Nummer sicher gehen möchten, verwenden Sie immer SCOPE_IDENTITY().Wenn du dabei bleibst @@IDENTITY und jemand beschließt, später einen Auslöser hinzuzufügen, wird Ihr gesamter Code kaputt gehen.

Das Beste (lesen Sie:Der sicherste Weg, die Identität einer neu eingefügten Zeile zu ermitteln, ist die Verwendung von output Klausel:

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)

Hinzufügen

SELECT CAST(scope_identity() AS int);

bis zum Ende Ihrer SQL-Anweisung einfügen

NewId = command.ExecuteScalar()

werde es abrufen.

MSDN

@@IDENTITY, SCOPE_IDENTITY und IDENT_CURRENT sind insofern ähnliche Funktionen, als sie den letzten in die IDENTITY-Spalte einer Tabelle eingefügten Wert zurückgeben.

@@IDENTITY und SCOPE_IDENTITY geben den letzten Identitätswert zurück, der in einer beliebigen Tabelle in der aktuellen Sitzung generiert wurde.Allerdings gibt SCOPE_IDENTITY den Wert nur innerhalb des aktuellen Bereichs zurück;@@IDENTITY ist nicht auf einen bestimmten Bereich beschränkt.

IDENT_CURRENT ist nicht durch Umfang und Sitzung beschränkt;es ist auf eine bestimmte Tabelle beschränkt.IDENT_CURRENT gibt den Identitätswert zurück, der für eine bestimmte Tabelle in jeder Sitzung und in jedem Bereich generiert wurde.Weitere Informationen finden Sie unter IDENT_CURRENT.

  • IDENT_CURRENT ist eine Funktion, die eine Tabelle als Argument akzeptiert.
  • @@IDENTITÄT kann ein verwirrendes Ergebnis zurückgeben, wenn Sie einen Auslöser in der Tabelle haben
  • SCOPE_IDENTITY ist die meiste Zeit dein Held.

Wenn Sie Entity Framework verwenden, verwendet es intern das OUTPUT Technik, um den neu eingefügten ID-Wert zurückzugeben

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

Die Ausgabeergebnisse werden in einer temporären Tabellenvariablen gespeichert, wieder mit der Tabelle verknüpft und geben den Zeilenwert aus der Tabelle zurück.

Notiz:Ich habe keine Ahnung, warum EF die ephemere Tabelle wieder mit der realen Tabelle verbinden würde (unter welchen Umständen würden die beiden nicht übereinstimmen).

Aber genau das macht EF.

Diese Technik (OUTPUT) ist nur auf SQL Server 2008 oder neuer verfügbar.

@@IDENTITÄT ist die letzte Identität, die über die aktuelle SQL-Verbindung eingefügt wurde.Dies ist ein guter Wert für die Rückgabe einer gespeicherten Prozedur zum Einfügen, bei der Sie lediglich die Identität für Ihren neuen Datensatz einfügen müssen und es Ihnen egal ist, ob danach weitere Zeilen hinzugefügt wurden.

SCOPE_IDENTITY ist die letzte Identität, die über die aktuelle SQL-Verbindung und im aktuellen Bereich eingefügt wurde. Das heißt, wenn nach Ihrer Einfügung eine zweite IDENTITY basierend auf einem Trigger eingefügt würde, würde diese nicht in SCOPE_IDENTITY widergespiegelt, sondern nur in der von Ihnen durchgeführten Einfügung.Ehrlich gesagt hatte ich nie einen Grund, dies zu verwenden.

IDENT_CURRENT(Tabellenname) ist die zuletzt eingefügte Identität, unabhängig von Verbindung oder Umfang.Sie können dies verwenden, wenn Sie den aktuellen IDENTITY-Wert für eine Tabelle abrufen möchten, in die Sie keinen Datensatz eingefügt haben.

Ich kann nicht mit anderen Versionen von SQL Server kommunizieren, aber im Jahr 2012 funktioniert die direkte Ausgabe einwandfrei.Sie müssen sich nicht um eine temporäre Tabelle kümmern.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)

Diese Technik funktioniert übrigens auch beim Einfügen mehrerer Zeilen.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
    (...),
    (...),
    (...)

Ausgabe

ID
2
3
4

STETS Wenn Sie „scope_identity()“ verwenden, ist NIEMALS etwas anderes erforderlich.

Nach Ihrer Insert-Anweisung müssen Sie diese hinzufügen.Und stellen Sie sicher, dass der Tabellenname angegeben ist, in den die Daten eingefügt werden. Sie erhalten die aktuelle Zeile ohne Angabe der Zeile, die gerade von Ihrer Einfügeanweisung betroffen ist.

IDENT_CURRENT('tableName')

Wenn Sie nach der zuletzt hinzugefügten/aktualisierten ID suchen, ist dies vielleicht etwas altmodisch, aber es gibt viele Leute, die älteres PHP verwenden, genauer gesagt vor 5.5.Weitere Details finden Sie unter http://php.net/manual/en/function.mysql-insert-id.php

$last = mysql_insert_id();

Ein ... kreieren uuid und fügen Sie es auch in eine Spalte ein.Dann können Sie Ihre Zeile leicht anhand der UUID identifizieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top