ストアドプロシージャの現在の行番号を取得できる関数またはキーワードはありますか?
ドキュメントに記載されていない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 ...
_
この質問は実際には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()
関数を使用する必要があります。
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;