Erstellen Sie zunächst zwei Tabellen:
CREATE TABLE xyz (Id INT)
CREATE TABLE abc (Id INT)
Bitte beachten Sie den folgenden SQL-Code:
DELETE FROM abc
BEGIN TRAN
EXEC('
INSERT INTO xyz VALUES (1),(2)
DECLARE @x INT = (SELECT Id FROM xyz)
')
INSERT INTO abc VALUES (1)
COMMIT
SELECT * FROM abc
Beim Ausführen wird der folgende Fehler ausgegeben:
Msg 512, Level 16, State 1, Line 3
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Und es gibt kein Ergebnis . Alles wie erwartet.
Nun lassen Sie uns den Fehler zu einem Syntaxfehler ändern durch Ersetzen xyz)
mit xyz
. Hier ist der Fehler:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'xyz'.
Aber diesmal gibt es ein Ergebnis:
Warum? Was ist los?
sql-server
sql-server-2012
Kennzeichen
quelle
quelle
Antworten:
Sie können das Verhalten Ihres ersten Beispiels steuern, indem Sie Folgendes angeben:
Am Anfang Ihres Skripts erhalten Sie kein Ergebnis. Sie erhalten ein Ergebnis, wie Sie es beschreiben, wenn Sie angeben
SET XACT_ABORT OFF
.Der Grund für das unterschiedliche Verhalten ist, dass das zweite Beispiel "Ersetzen
xyz)
durchxyz
" einen Syntaxfehler enthält, dh der EXEC-Stapel wird analysiert, ein Syntaxfehler entdeckt und der Stapel wird nicht ausgeführt. Die EXEC ist ein separater Stapel (aus diesem Grund können Sie Variablen außerhalb von EXEC nicht definieren und innerhalb von EXEC referenzieren). Die Verarbeitung wird mit dem Rest der Transaktion fortgesetzt.Für das erste Beispiel "
(SELECT Id FROM xyz)
" ist dies eine gültige Syntax, sodass der Stapel korrekt analysiert wird. Der Fehler wird nur zur Laufzeit gefunden und die Verarbeitung wird fortgesetzt, wenn,SET XACT_ABORT OFF
aber wenn gestopptSET XACT_ABORT ON
.quelle
@@TRANCOUNT
zurücksetzen (das Internet sagt, ich muss es vorher überprüfen ) und den ursprünglichen Fehler erneut auslösen mitTHROW
. Viel Code.Das Verhalten hängt von SET XACT_ABORT ab und wird im folgenden Zitat aus dem verlinkten Artikel erläutert.
quelle