Ist es in SQL Server möglich, die „ID“ eines Datensatzes abzurufen, wenn „Insert“ ausgeführt wird?
-
09-06-2019 - |
Frage
In SQL Server 2005 habe ich ein „id“-Feld in einer Tabelle, dessen Eigenschaft „Ist Identität“ auf „Ja“ gesetzt ist.Wenn also eine Einfügung für diese Tabelle ausgeführt wird, wird die „id“ automatisch auf die nächste inkrementierende Ganzzahl gesetzt.Gibt es eine einfache Möglichkeit, wenn die Einfügung ausgeführt wird, den Wert zu ermitteln, auf den die „id“ festgelegt wurde, ohne direkt nach der Einfügung eine Select-Anweisung ausführen zu müssen?
Duplikat von:
Der beste Weg, um die Identität der eingefügten Zeile zu ermitteln?
Lösung
.Net zumindest können Sie mehrere Anfragen an den Server in einem Rutsch senden. Ich tue dies in meiner App:
command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();
Funktioniert wie ein Zauber.
Andere Tipps
Wenn Sie mehrere Zeilen sind das Einfügen, die Verwendung der OUTPUT
und INSERTED.columnname
Klausel über die insert
Anweisung ist eine einfache Möglichkeit, alle IDs in eine temporäre Tabelle zu bekommen.
DECLARE @MyTableVar table( ID int,
Name varchar(50),
ModifiedDate datetime);
INSERT MyTable
OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar
SELECT someName, GetDate() from SomeTable
SCOPE_IDENTITY () ist der bevorzugte Weg, finden Sie unter: 6 verschiedene Möglichkeiten die aktuelle Identität Wert zu erhalten
SCOPE_IDENTITY (); ist die beste Wahl. Und wenn Sie .NET verwenden nur einen unserer Parameter übergeben und den Wert überprüfen, nachdem die Prozedur ausgeführt wird.
CREATE PROCEDURE [dbo].[InsertProducts]
@id INT = NULL OUT,
@name VARCHAR(150) = NULL,
@desc VARCHAR(250) = NULL
AS
INSERT INTO dbo.Products
(Name,
Description)
VALUES
(@name,
@desc)
SET @id = SCOPE_IDENTITY();
Sie haben die scope_identity () Funktion wählen.
Dieser Code von Anwendung zu tun, ich diesen Vorgang normalerweise kapseln in einer gespeicherten Prozedur, so dass es wie eine Abfrage zu meiner Anwendung sieht immer noch.
Ich neige dazu, lieber einen Trigger an den Tisch befestigt Enterprise Manager. Auf diese Weise brauchen Sie nicht über das Schreiben aus zusätzlichen SQL-Anweisungen in Ihrem Code zu kümmern. Mine in etwa so aussehen:
Erstellen Sie Trigger-tblname auf dbo.tblName für Insert Wie wählen new_id = @@ IDENTITY
Dann aus dem Code, behandeln Sie Ihre Insert-Anweisungen wie wählen statements- Gerade auszuführen und die Ergebnisse zu bewerten. die „newID“ -Spalte die Identität der Zeile enthält soeben erstellt wurde.
Dies ist wahrscheinlich die beste Arbeits Lösung, die ich für SQL Server gefunden .. SQL Server geben den Wert der Identitätsspalte nach Einsatz Aussage