Когда я использую SQL Server и возникает ошибка, в сообщении об ошибке указывается номер строки, не связанный с номерами строк в хранимой процедуре. Я предполагаю, что разница связана с пробелами и комментариями, но так ли это на самом деле?
Как я могу связать эти два набора номеров строк друг с другом? Если бы кто-нибудь мог дать мне хотя бы указатель в правильном направлении, я был бы очень признателен.
Я использую SQL Server 2005.
sql
sql-server-2005
чама
источник
источник
create proc
моем тесте казалось, что он начал отсчет с линии. Я полагаю, вы видите что-то другое.Ответы:
IIRC, он начинает подсчет строк с начала пакета, который создал этот процесс. Это означает либо начало сценария, либо последний оператор «GO» перед оператором create / alter proc.
Более простой способ увидеть это - извлечь фактический текст, который SQL Server использовал при создании объекта. Переключите вывод в текстовый режим (CTRL-T с сопоставлением клавиш по умолчанию) и запустите
Скопируйте и вставьте результаты в окно скрипта, чтобы получить подсветку синтаксиса и т. Д., И используйте функцию goto line (я думаю, CTRL-G), чтобы перейти к сообщаемой строке ошибки.
источник
По привычке помещаю
LINENO 0
сразу послеBEGIN
в свои хранимые процедуры. Это сбрасывает номер строки - в данном случае на ноль. Затем просто добавьте номер строки, указанный в сообщении об ошибке, к номеру строки в SSMS, где вы написали,LINENO 0
и bingo - у вас есть номер строки с ошибкой, представленный в окне запроса.источник
Если вы используете блок Catch и использовали RAISERROR () для любой проверки кода в блоке Try, то в строке ошибок сообщается, где находится блок Catch, а не где произошла настоящая ошибка. Я использовал это вот так, чтобы прояснить это.
источник
На самом деле это
Error_number()
работает очень хорошо.Эта функция начинает отсчет с последнего оператора GO (Batch Separator), поэтому, если вы не использовали пробелы Go, но он по-прежнему показывает неправильный номер строки, добавьте к нему 7, как в хранимой процедуре в строке номер 7 разделитель пакетов используется автоматически. Поэтому, если вы выберете Cast (Error_Number () + 7 as Int) в качестве [Error_Number] - вы получите желаемый ответ.
источник
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.
- что это должно было значить?В TSQL / хранимых процедурах
Вы можете получить такую ошибку, как:
Это означает, что ошибка находится в строке 177 пакета. Не 177 в SQL. Вы должны увидеть, с какого номера строки начинается ваш пакет, в моем случае [7], а затем вы добавляете это значение к номеру строки, чтобы определить, какой оператор неверен.
источник
вы можете использовать это
и если вы хотите создать таблицу журнала ошибок, вы можете использовать это:
источник
Длинный ответ: номер строки отсчитывается от
CREATE PROCEDURE
оператора, плюс любые пустые строки или строки комментариев, которые могли быть над ним, когда вы действительно запускалиCREATE
оператор, но не считая никаких строк передGO
оператором ...Я обнаружил, что намного проще сделать сохраненный процесс, чтобы поиграть с ним, чтобы подтвердить:
После того, как вы создали его, вы можете переключиться на него
ALTER PROCEDURE
и добавить несколько пустых строк над комментариями, а также над и под первымGO
оператором, чтобы увидеть эффект.Одна очень странная вещь, которую я заметил, заключалась в том, что мне приходилось запускать
EXEC ErrorTesting
в новом окне запроса вместо того, чтобы выделять его в нижней части того же окна и запускать… Когда я это делал, номера строк продолжали расти! Не знаю, почему это произошло ...источник
вы можете получить сообщение об ошибке и строку ошибки в блоке catch следующим образом:
источник