Quando eu uso o SQL Server e há um erro, a mensagem de erro fornece um número de linha que não tem correlação com os números de linha no procedimento armazenado. Presumo que a diferença se deva ao espaço em branco e aos comentários, mas é mesmo?
Como posso relacionar esses dois conjuntos de números de linha entre si? Se alguém pudesse me dar pelo menos uma indicação na direção certa, eu realmente apreciaria.
Estou usando o SQL server 2005.
sql
sql-server-2005
chama
fonte
fonte
create proc
linha em meu teste. Presumo que você esteja vendo algo diferente.Respostas:
IIRC, ele começa a contar linhas desde o início do lote que criou aquele proc. Isso significa o início do script ou então a última instrução "GO" antes da instrução create / alter proc.
Uma maneira mais fácil de ver isso é puxar o texto real que o SQL Server usou ao criar o objeto. Mude sua saída para o modo de texto (CTRL-T com os mapeamentos de teclas padrão) e execute
Copie e cole os resultados em uma janela de script para obter o realce da sintaxe, etc., e use a função goto line (CTRL-G, eu acho) para ir para a linha de erro relatada.
fonte
Por hábito, coloco
LINENO 0
logo depoisBEGIN
em meus procedimentos armazenados. Isso redefine o número da linha - para zero, neste caso. Em seguida, basta adicionar o número da linha relatado pela mensagem de erro ao número da linha no SSMS onde você escreveuLINENO 0
e bingo - você tem o número da linha do erro conforme representado na janela de consulta.fonte
Se você usar um Catch Block e um RAISERROR () para qualquer validação de código dentro do Try Block, a linha de erro será relatada onde o Catch Block está e não onde o erro real ocorreu. Eu usei assim para esclarecer isso.
fonte
Na verdade, isso
Error_number()
funciona muito bem.Esta função inicia contagens a partir da última instrução GO (separador de lote), então se você não usou nenhum espaço Go e ainda está mostrando um número de linha errado - então adicione 7 a ele, como no procedimento armazenado na linha número 7 o separador de lote é usado automaticamente. Portanto, se você usar selecionar Cast (Error_Number () + 7 como Int) como [Error_Number] - você obterá a resposta desejada.
fonte
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.
- o que isso queria dizer?Em TSQL / procedimentos armazenados
Você pode obter um erro como:
Isso significa que o erro está na linha 177 do lote. Não 177 no SQL. Você deve ver em qual número de linha seu lote começa, no meu caso [7], e então você adiciona esse valor ao número da linha para descobrir qual declaração está errada
fonte
você pode usar isso
e se você quiser fazer uma tabela de log de erros, você pode usar isto:
fonte
A resposta longa: o número da linha é contado a partir da
CREATE PROCEDURE
declaração, mais quaisquer linhas em branco ou linhas de comentário que você possa ter colocado acima quando executou aCREATE
declaração, mas sem contar as linhas antes de umGO
declaração ...Achei muito mais fácil fazer um procedimento armazenado para testar e confirmar:
Depois de criá-lo, você pode alternar para
ALTER PROCEDURE
e adicionar algumas linhas em branco acima dos comentários e acima e abaixo do primeiroGO
instrução para ver o efeito.Uma coisa muito estranha que notei foi que tive que correr
EXEC ErrorTesting
em uma nova janela de consulta em vez de realçá-la na parte inferior da mesma janela e executar ... Quando fiz isso, os números das linhas continuaram aumentando! Não tenho certeza por que isso aconteceu ..fonte
você pode obter a mensagem de erro e a linha de erro no bloco catch como este:
fonte