Existe uma função ou palavra-chave que me permitirá obter o número da linha atual em um procedimento armazenado?
Eu sei que há uma LineNo
função não documentada que permite definir o número da linha e afetar a saída das mensagens de erro do sistema
https://stackoverflow.com/questions/4054511/what-exactly-does-the-t-sql-lineno-reried -palavra-fazer
Eu sei que há uma função ERROR_LINE()
disponível dentro de um arquivo BEGIN CATCH ... END CATCH
.
ERROR_LINE()
faz o que preciso, mas quero usá-lo de fora de um bloco CATCH. Em qualquer lugar do arquivo.
DECLARE @InsertSource VARCHAR(1000) = object_name(@@procid)
EXEC PROC_Accounting_Transaction_Insert ... other parameters..., @InsertSource
Atualmente, estou apenas codificando o número da chamada conforme ele aparece no corpo do procedimento armazenado, mas está envelhecendo rapidamente.
DECLARE @InsertSource VARCHAR(1000)
SET @InsertSource = object_name(@@procid) + '#1'
EXEC ...
SET @InsertSource = object_name(@@procid) + '#2'
EXEC ...
Na verdade, essa pergunta surgiu há 2,5 anos no StackOverflow, e postei uma resposta lá:
Número da linha de impressão SQL no comentário do procedimento armazenado criado dinamicamente?
A parte relevante dessa resposta é copiada abaixo:
Você pode usar
TRY
/CATCH
com um erro forçado, pois oCATCH
bloco pode retornar o número da linha em que ocorreu o erro por meio daERROR_LINE()
função. A construção completa, formatada para facilitar a leitura, é:Agora, para que a
@LineNumber
variável seja preenchida com o número da linha em que está sendo definida, você pode reduzir essa construção a uma única linha da seguinte maneira:Observe que o
THROW
comando foi iniciado no SQL Server 2012. Se você estiver usando o SQL Server 2005, 2008 ou 2008 R2, precisará usar aRAISERROR()
função em vez deTHROW
.Adam Machanic me enviou isso por e-mail
Ele se qualifica como uma linha em meu livro.
Por @ScottGartner, um verdadeiro one-liner.