Überprüfen Sie die Tabelle, die für alle INSERT-Trigger eingefügt wird, und überprüfen Sie, ob diese INSERT-Trigger SET NOCOUNT ON verwenden.
Wenn ein Trigger SET NOCOUNT ON nicht angibt, wird bei der Aktualisierung der Datenbank eine Ergebnismenge generiert. Diese Ergebnismenge wird vor der Ergebnismenge angezeigt, die das Ergebnis SCOPE_IDENTITY enthält.
Siehe: https://msdn.microsoft.com/en-us/library/ms189837.aspx
In Wirklichkeit, was ist passiert, dass der Re-Cord enthält eine oder mehr Ergebnismengen.
TRIGGER RESULT SET
SCOPE_IDENTITY RESULT SET
Wenn Sie das Recordset für eine Bereichsidentität abfragen, fragen Sie tatsächlich die Ergebnismenge ab, die vom Trigger ausgegeben wird.
können Sie RS.nextRecordset()
verwenden und dann die SCOPE_IDENTITY
abfragen, aber wenn der Auslöser ein Update durchführen kann oder nicht Sie am Ende nicht zu wissen, was Ihre SCOPE_IDENTITY
Ergebnismenge enthält, ist es das erste oder das zweite, gibt es eine zweite?
Es ist allgemein gute Praxis akzeptiert für Trigger SET NOCOUNT ON
jedoch angeben, wenn Sie absolut SET NOCOUNT OFF
in Ihrem Trigger haben müssen oder haben keine Kontrolle über den Trigger, können Sie mit dem folgenden Code um ihn herum arbeiten.
Hinweis: Die Gültigkeitsbereichsidentität in den obigen Beispielen wird immer das letzte Ergebnis im Re-Cord-Set sein. So können wir es finden, wie folgt:
var I = DB.Execute(insert_statement_from_above);
if (I) {
// find the result set with the scope identity in it
while (I.State == 0) {
I = I.nextRecordset();
}
var INSERTED_ID = I(0).Value;
}
Das für die Ergebnismenge sieht, dass Ihr Anwendungsbereich Identität enthält, die durch die früheren geschlossenen Ergebnismengen zu ignorieren. Auch
Siehe:
State property, nextRecordset()
"auto-nummer spalte", meinst du identität spalte? –
danke für das Erkennen des Terminologiefehlers –