2016-12-12 5 views
0

Ich versuche herauszufinden, was hier ein Problem so lange sein könnte. Ich habe eine gespeicherte Prozedur, in der ich einen INSERT habe. Bei zahlreichen Einträgen wurde die Gültigkeitsdauer scope_identity dieses Insert zurückgegeben. Aber für wenige gibt es nur null zurück und daher schlägt die nächste Einfügung mit einem Fehler fehl (da dieser Wert in der anderen Tabelle nicht null sein kann).SCOPE_IDENTITY() gibt null nur für wenige Datensätze zurück

In den Protokollen konnte ich mehrere Anfragen für diese gespeicherte Prozedur zur gleichen Zeit (1 ms) sehen.

Ich denke, die Ids erzeugt werden, wie ich eine Lücke in den einzigartigen Identitäten in der Tabelle zur gleichen Zeit wie die mehrere Anfragen kamen zu sehen.

, dass jedes Problem mit dem scope_identity werden kann()?

+0

Ich bezweifle Gleichzeitigkeit ist ein Problem. 'SCOPE_IDENTITY()' bleibt 'NULL', wenn keine Zeile eingefügt wurde, möglicherweise aufgrund eines Fehlers. –

+0

Rechts. Meine 2. Einfügeanweisung gibt einen Fehler aus, den ich in meinen Protokollen habe. Aber der erste Insert hat nie einen Fehler verursacht. Aber die scope_identity ist null. vielleicht muss ich die insert-Anweisung genauer betrachten. – Shrav

+0

Scope_identity speichert die ID der letzten Insert-Anweisung im aktuellen Bereich. Die letzte Insert-Anweisung war nicht erfolgreich. Ermitteln Sie nach jeder Einfügung die Bereichsidentität, wenn Sie sie benötigen. –

Antwort

1

Wenn zwischen Identitätswerten in einer IDENTITY-Spalte eine Lücke liegt und die Lücke mit dem Eigenschaftswert der Identitätsinkrement der Spalte übereinstimmt, wurde der Wert für die automatische Erhöhung gezogen, um während des Einfügens angewendet zu werden Falsch in der Einfügung, zum Beispiel eine Fremdschlüsseleinschränkung. Sobald der nächste Autoinkrementwert für den nächsten Datensatz abgerufen wird, ist er für immer verloren, auch wenn eine Transaktion fehlschlägt. Sie müssen während des Einfügevorgangs nach Fehlern suchen.

+0

Sieht so aus, als ob mein Einfügen fehlschlägt, während ich versuche, einen Nullwert in eine Nicht-Null-Spalte einzufügen. Danke, dass Sie mich dazu gebracht haben, das zu untersuchen. – Shrav

-1

Ich hatte das gleiche Problem mit meiner Webanwendung, wo viele Anfrage Zugriff auf die gleiche Tabelle zur gleichen Zeit, um Datensatz einfügen, um zu verhindern, müssen Sie "SQL-Transaktion" verwenden, was in Ihrem Fall passiert ist Ihre Operation zu schnell zu execute und wenn insert-Befehl ausgeführt wird, wird die Tabelle gesperrt.

für SQL-Transaktion verwenden diese Informationen hilfreich Link: SQL Transaction

Verwandte Themen