web-dev-qa-db-ja.com

実行中のストアドプロシージャから現在の行番号を取得する方法

ストアドプロシージャの現在の行番号を取得できる関数またはキーワードはありますか?

ドキュメントに記載されていないLineNo関数を使用して、行番号を設定し、システムエラーメッセージの出力に影響を与えることを知っています https://stackoverflow.com/questions/4054511/what-exactly-does -the-t-sql-lineno-reserved-Word-do

_BEGIN CATCH ... END CATCH_の内部で使用できる関数ERROR_LINE()があることを知っています。

ERROR_LINE()は必要なことを行いますが、CATCHブロックの外側から使用したいと思います。ファイル内の任意の場所。

_ DECLARE @InsertSource VARCHAR(1000) = object_name(@@procid)
 EXEC PROC_Accounting_Transaction_Insert ... other parameters..., @InsertSource
_

現在、ストアドプロシージャの本体に表示されるように、呼び出しをハードコーディングしています#が、すぐに古くなっています。

_DECLARE @InsertSource VARCHAR(1000) 

SET @InsertSource = object_name(@@procid) + '#1'
EXEC ...

SET @InsertSource = object_name(@@procid) + '#2'
EXEC ...
_
7
JJS

この質問は実際には2.5年前にStackOverflowで出されたもので、私はそこに回答を投稿しました。

動的に作成されたストアドプロシージャのコメントのSQL印刷行番号?

その回答の関連部分を以下にコピーします。


TRYブロックはERROR_LINE()関数を介してエラーが発生した行番号を返すことができるため、強制エラーでCATCH/CATCHを使用できます。読みやすいようにフォーマットされた完全な構造は次のとおりです。

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

さて、@LineNumber変数に設定されている行番号を入力するには、次のようにその構成を1行に減らすことができます。

BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH

SQL Server 2012で開始されたTHROWコマンドに注意してください。SQLServer 2005、2008、または2008 R2を使用している場合は、THROWではなくRAISERROR()関数を使用する必要があります。

5
Solomon Rutzky

Adam Machanic これをメールで送ってくれた

DECLARE @lineno INT
BEGIN TRY SET @lineno = 1/0 END TRY BEGIN CATCH SET @lineno = ERROR_LINE() END CATCH

それは私の本の1行として認められます。

@ScottGartnerによると、真のワンライナーです。

BEGIN TRY print 1/0; END TRY BEGIN CATCH print 'Line Number: ' + CAST(ERROR_LINE() as nvarchar(20)); END CATCH;
4
JJS