neue SQL Datensatz-ID
Wie kann ich die automatisch generierte ID für einen neuen Datensatz den ich gerade eingefügt?
(Mit ASP-classic und MSSQL 2005)
vielen Dank alle, die vorgeschlagenen SELECT SCOPE_IDENTITY(). Ich war in der Lage, eine gespeicherte Prozedur erstellen: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[Drehungen] (@N varchar(30) AS BEGIN TRANSACTION-Ins EINFÜGEN IN EINE (n) WERTE (@N) SELECT NewID = SCOPE_IDENTITY()
'mit VB ich namens der sp:<br> Set cn = Server.CreateObject("ADODB.Verbindung") connectString = "DSN" cn.Öffnen connectString, "user", "PW0rd" Set rs = Server.CreateObject("ADODB.Recordset") set rs = cn.Execute("EXEC [DB].[dbo].[A] @Str=" & str)<br> 'wieder den Wert:<br> resultID = rs(0)
'mit VB ich namens der sp:<br> Set cn = Server.CreateObject("ADODB.Verbindung") connectString = "DSN" cn.Öffnen connectString, "user", "PW0rd" Set rs = Server.CreateObject("ADODB.Recordset") set rs = cn.Execute("EXEC [DB].[dbo].[A] @Str=" & str)<br> 'wieder den Wert:<br> resultID = rs(0)
InformationsquelleAutor Keith | 2009-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
mithilfe von @@IDENTITY kann zu unerwarteten Ergebnissen führen, so vorsichtig sein, wie Sie diese verwenden. Trigger das einfügen von Datensätze in anderen Tabellen führen die @@IDENTITY-Wert zu ändern - wo SCOPE_IDENTITY() geben Sie die Letzte Identität von Ihrem derzeitigen Umfang.
Hier ist ein Beispiel, das zeige den Unterschied zwischen der von @@IDENTITY und SCOPE_INSERT() und wie können diese unterschiedliche Werte zurückgeben..
Andere Möglichkeit, niemand hat hier behandelt wird, ist die Verwendung der OUTPUT-Klausel in SQL 2005. In diesem Fall würden Sie müssen nur fügen Sie die output-Klausel, um Ihr einfügen, und dann fangen Sie das recordset aus dem code. Dies funktioniert gut, wenn das einfügen mehrerer Datensätze statt nur 1...
InformationsquelleAutor Scott Ivey
SELECT @@IDENTITY den in der Regel funktioniert, aber zurückgeben könnte, die Identität eines Datensatzes eingefügt, weil der Auslöser oder so etwas, und nicht das original.
SELECT SCOPE_IDENTITY ist, was ich empfehlen würde. Es gibt Werte eingefügt nur im aktuellen Gültigkeitsbereich.
Gibt es auch ein "IDENT_CURRENT(tablename)" liefert den letzten identity-eingefügt, die für eine bestimmte Tabelle.
InformationsquelleAutor BradC
Es gibt drei Möglichkeiten, um den letzten Identität in sql.
Wurden Sie bereits von anderen erwähnt, aber der Vollständigkeit halber:
Darüber hinaus gibt es drei Wege nehmen, die ID und senden Sie es auf Ihrem client-code:
Verwenden Sie ein output-parameter einer gespeicherten Prozedur
Verwenden Sie einen Wert zurück.
Wählen Sie die id in ein ResultSet. Zum Beispiel, Ihre sql-Anweisung würde wie folgt Aussehen:
Leider (oder zum Glück, aus meiner Sicht) meine Klassischen ASP ist es zu weit Weg, um zu zeigen, Beispiele für die ersten beiden von client-code.
InformationsquelleAutor Joel Coehoorn
SELECT @@Identity oder SELECT SCOPE_IDENTITY() beide arbeiten aber die Auswahl bei SCOPE_Identity() ist sicherer, weil es gibt den letzten automatisch generierten ID in Ihrem derzeitigen Umfang. So zum Beispiel angenommen wir haben eine Tabelle namens ScopeIDTable und auf dieser Tabelle haben wir einen trigger. Dieser trigger insert into einen Datensatz in TriggerIdTable beide Tabellen haben einen auto increment-Spalte.
Wenn Sie SELECT @@Identity erhalten Sie den letzten auto-Inkrement in dieser Sitzung, das wäre die Id generiert aus dem trigger (TriggerIdTable).
Wenn Sie SELECT SCOPE_IDENTITY() bekommt die id aus der ScopeIdTable.
InformationsquelleAutor JoshBerke
Sie die Abfrage ausführen
unter Verwendung der gleichen Datenbank-Verbindung, bevor Sie irgendetwas anderes mit ihm. Das Ergebnis ist, wie Sie wahrscheinlich erwarten, die einen Datensatz enthält eine einzelne Zeile mit einem einzelnen Feld. Sie können auf das Feld mit index 0, oder Sie können ihm einen Namen geben, wenn Sie es vorziehen, dass:
InformationsquelleAutor Guffa
Fragte ich mich immer, warum man jemals wollen würde zu benutzen
seit
ist offensichtlich das die meisten sicheren Weg zu erreichen, was Scot ist für Fragen.
InformationsquelleAutor Roel Snetselaar
Wo mehrere Datensätze müssen eingefügt auf einmal in einem Satz-Basis-Mode, es kann mehr interessant.
Habe ich manchmal verwendet GUIDs generiert) (aber für das klassische ASP-würde Sie wahrscheinlich benötigen, um ein Dienstprogramm zum generieren der Werte) oder, häufiger, eine NEWSQUENTIALID() Einschränkung auf den GUID-Schlüssel-Spalte auf dem server.
Ich bin mir bewusst, dass nicht jeder wie GIUDS obwohl, für einige sehr triftige Gründe (Ihre Größe und welche Auswirkungen Sie auf die Indizierung/paging).
http://www.sqlmag.com/Articles/Index.cfm?ArticleID=50164&pg=2
InformationsquelleAutor kpollock
Dank alle, die vorgeschlagenen SELECT SCOPE_IDENTITY(). Ich war in der Lage, eine gespeicherte Prozedur erstellen:
und rufen Sie die sproc mit VB:
Kann ich jetzt verwenden resultID ich immer wenn ich auf die neu erzeugte ID.
InformationsquelleAutor Keith