web-dev-qa-db-fra.com

Comment obtenir le numéro de ligne actuel à partir d'une procédure stockée en cours d'exécution

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 ...
7
JJS

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.

5
Solomon Rutzky

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;
4
JJS