Wenn ich SQL Server verwende und ein Fehler auftritt, gibt die Fehlermeldung eine Zeilennummer an, die nicht mit den Zeilennummern in der gespeicherten Prozedur korreliert. Ich gehe davon aus, dass der Unterschied auf Leerzeichen und Kommentare zurückzuführen ist, aber ist es wirklich so?
Wie kann ich diese beiden Sätze von Zeilennummern miteinander in Beziehung setzen? Wenn mir jemand wenigstens einen Hinweis in die richtige Richtung geben könnte, würde ich es wirklich schätzen.
Ich verwende SQL Server 2005.
sql
sql-server-2005
Chama
quelle
quelle
create proc
in meinem Test von der Linie zu zählen . Ich nehme an, Sie sehen etwas anderes.Antworten:
IIRC beginnt mit dem Zählen der Zeilen ab dem Beginn des Stapels, der diesen Prozess erstellt hat. Dies bedeutet entweder den Start des Skripts oder die letzte "GO" -Anweisung vor der Anweisung create / alter proc.
Eine einfachere Möglichkeit, dies zu erkennen, besteht darin, den tatsächlichen Text abzurufen, den SQL Server beim Erstellen des Objekts verwendet hat. Schalten Sie Ihre Ausgabe in den Textmodus (STRG-T mit den Standardtastenzuordnungen) und führen Sie sie aus
Kopieren Sie die Ergebnisse, fügen Sie sie in ein Skriptfenster ein, um Syntaxhervorhebungen usw. zu erhalten, und verwenden Sie die Funktion goto line (STRG-G, glaube ich), um zur gemeldeten Fehlerzeile zu gelangen.
quelle
Aus Gewohnheit lege ich
LINENO 0
direkt danachBEGIN
in meine gespeicherten Prozeduren. Dies setzt die Zeilennummer zurück - in diesem Fall auf Null. Fügen Sie dann einfach die von der Fehlermeldung gemeldete Zeilennummer zur Zeilennummer in SSMS hinzu, in die Sie geschrieben haben,LINENO 0
und Bingo - Sie haben die Zeilennummer des Fehlers, wie im Abfragefenster dargestellt.quelle
Wenn Sie einen Catch Block verwenden und RAISERROR () für eine Codeüberprüfung innerhalb des Try Blocks verwenden, wird die Fehlerzeile dort gemeldet, wo sich der Catch Block befindet und nicht dort, wo der tatsächliche Fehler aufgetreten ist. Ich habe es so benutzt, um das zu klären.
quelle
Eigentlich
Error_number()
funktioniert das sehr gut.Diese Funktion startet die Zählung ab der letzten GO-Anweisung (Batch Separator). Wenn Sie also keine Go-Leerzeichen verwendet haben und immer noch eine falsche Zeilennummer angezeigt wird, fügen Sie 7 hinzu, wie in der gespeicherten Prozedur in Zeile 7 des Batch-Separators wird automatisch verwendet. Wenn Sie also Cast (Error_Number () + 7 als Int) als [Error_Number] auswählen, erhalten Sie die gewünschte Antwort.
quelle
if you have not used any Go spaces and it is still showing a wrong line number - then add 7 to it, as in stored procedure in line number 7 the batch separator is used automatically.
- Was sollte das heißen?In TSQL / Gespeicherte Prozeduren
Möglicherweise erhalten Sie eine Fehlermeldung wie:
Dies bedeutet, dass sich der Fehler in Zeile 177 im Stapel befindet. Nicht 177 in der SQL. Sie sollten sehen, mit welcher Zeilennummer Ihr Stapel beginnt, in meinem Fall [7], und dann diesen Wert zur Zeilennummer hinzufügen, um festzustellen, welche Anweisung falsch ist
quelle
Sie können dies verwenden
und wenn Sie eine Fehlerprotokolltabelle erstellen möchten, können Sie Folgendes verwenden:
quelle
Die lange Antwort: Die Zeilennummer wird aus der
CREATE PROCEDURE
Anweisung gezählt, plus alle Leerzeilen oder Kommentarzeilen, die Sie möglicherweise darüber hatten, als Sie dieCREATE
Anweisung tatsächlich ausgeführt haben , aber keine Zeilen vor einerGO
Anweisung gezählt haben…Ich fand es viel einfacher, einen gespeicherten Prozess zum Herumspielen zu erstellen, um Folgendes zu bestätigen:
Nachdem Sie es erstellt haben, können Sie es ändern
ALTER PROCEDURE
und einige leere Zeilen über den Kommentaren und über und unter der erstenGO
Anweisung hinzufügen , um den Effekt zu sehen.Eine sehr seltsame Sache, die mir auffiel, war, dass ich
EXEC ErrorTesting
in einem neuen Abfragefenster laufen musste, anstatt es am unteren Rand desselben Fensters hervorzuheben und zu laufen ... Als ich das tat, stiegen die Zeilennummern weiter an! Ich bin mir nicht sicher, warum das passiert ist.quelle
Sie können Fehlermeldung und Fehlerzeile in catch-Block wie folgt erhalten:
quelle