Existe-t-il une fonction ou un mot-clé qui me permettra d'obtenir le numéro de ligne actuel dans une procédure stockée?
Je sais qu'il existe une fonction LineNo
non documentée qui vous permet de définir le numéro de ligne et d'affecter la sortie des messages d'erreur système https://stackoverflow.com/questions/4054511/what-exactly-does -le-t-sql-lineno-réservé-Word-do
Je sais qu'il y a une fonction ERROR_LINE()
qui est disponible à l'intérieur d'un BEGIN CATCH ... END CATCH
.
ERROR_LINE()
fait ce dont j'ai besoin, mais je veux l'utiliser depuis l'extérieur d'un bloc CATCH. N'importe où dans le fichier.
DECLARE @InsertSource VARCHAR(1000) = object_name(@@procid)
EXEC PROC_Accounting_Transaction_Insert ... other parameters..., @InsertSource
Actuellement, je ne fais que coder en dur l'appel # tel qu'il apparaît dans le corps de la procédure stockée, mais il vieillit rapidement.
DECLARE @InsertSource VARCHAR(1000)
SET @InsertSource = object_name(@@procid) + '#1'
EXEC ...
SET @InsertSource = object_name(@@procid) + '#2'
EXEC ...
Cette question a été posée il y a 2,5 ans sur StackOverflow, et j'ai posté une réponse là-bas:
Numéro de ligne d'impression SQL en commentaire d'une procédure stockée créée dynamiquement?
La partie pertinente de cette réponse est copiée ci-dessous:
Vous pouvez utiliser TRY
/CATCH
avec une erreur forcée car le bloc CATCH
peut renvoyer le numéro de ligne sur lequel l'erreur s'est produite via la fonction ERROR_LINE()
. La construction complète, formatée pour la lisibilité, est la suivante:
DECLARE @Line INT = -1; -- default to an invalid line #
-- some code
BEGIN TRY
;THROW 50000, 'Line#', 1; -- all 3 values are arbitrary, but required
END TRY
BEGIN CATCH
SET @LineNumber = ERROR_LINE();
END CATCH
-- some code
Maintenant, pour que la variable @LineNumber
Se remplisse avec le numéro de ligne sur lequel elle est définie, vous pouvez réduire cette construction en une seule ligne comme suit:
BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
Veuillez noter que la commande THROW
a démarré dans SQL Server 2012. Si vous utilisez SQL Server 2005, 2008 ou 2008 R2, vous devez utiliser la fonction RAISERROR()
au lieu de THROW
.
Adam Machanic m'a envoyé ceci par e-mail
DECLARE @lineno INT
BEGIN TRY SET @lineno = 1/0 END TRY BEGIN CATCH SET @lineno = ERROR_LINE() END CATCH
Il se qualifie comme une ligne dans mon livre.
Per @ScottGartner, un vrai one-liner.
BEGIN TRY print 1/0; END TRY BEGIN CATCH print 'Line Number: ' + CAST(ERROR_LINE() as nvarchar(20)); END CATCH;