エラーメッセージから実際のストアドプロシージャの行番号を取得するにはどうすればよいですか?


110

SQL Serverを使用しているときにエラーが発生すると、エラーメッセージに、ストアドプロシージャの行番号と相関関係のない行番号が表示されます。違いは空白とコメントによるものだと思いますが、本当ですか?

これら2つの行番号のセットを相互に関連付けるにはどうすればよいですか?誰かが私に少なくとも正しい方向への指針を与えることができれば、私は本当にそれを感謝します。

SQL Server 2005を使用しています。


1
行番号はプロシージャの本体に関連していると思います。つまり、ヘッダーを無視します。
Martin Smith、


ヘッダーはどこで終わりますか?変更手順に続く開始後... AS?
chama 2010

create procテストの行から数え始めたようです。何か違うものを見ていると思います。
Martin Smith、

1
ここに私の答えで説明:stackoverflow.com/questions/2947173/...
GBN

回答:


113

IIRC、それはそのプロシージャを作成したバッチの開始から行のカウントを開始します。これは、スクリプトの開始、またはcreate / alter procステートメントの前の最後の「GO」ステートメントのいずれかを意味します。

これを確認する簡単な方法は、SQL Serverがオブジェクトの作成時に使用した実際のテキストを取得することです。出力をテキストモード(デフォルトのキーマッピングではCTRL-T)に切り替えて実行します。

sp_helptext proc_name

結果をスクリプトウィンドウにコピーして貼り付けて、構文の強調表示などを取得し、goto line関数(CTRL-Gだと思います)を使用して、報告されたエラー行に移動します。


14
私は、グリッド出力モードでこれをやったとき、それはあまりにも上の行番号を立ち往生
codeulike

2
@codeulike-良い点、グリッド出力を使用する場合、行番号は行番号と一致するため、CTRL + Gを使用する必要はありません。グリッド出力の唯一の問題は、タブ文字が単一のスペースに変更されるため、すべてのフォーマットが失われることです。
リック

32

習慣LINENO 0からBEGIN、自分のストアドプロシージャの直後に配置します。これにより、行番号がリセットされます。この場合はゼロになります。次に、エラーメッセージで報告された行番号を、SSMSで書き込んだLINENO 0ビンゴの行番号に追加し、ビンゴします。クエリウィンドウに表示されているエラーの行番号が表示されます。


4
報告された行番号に自動的に追加されるように、「LineNo X」にX =ステートメントを配置した行番号を入れてみませんか?
LarryBud

8

Catchブロックを使用し、Tryブロック内のコード検証にRAISERROR()を使用した場合、Catchブロックがある場所と実際のエラーが発生した場所ではなく、エラー行が報告されます。私はそれをこのように使ってそれを片付けました。

BEGIN CATCH
  DECLARE @ErrorMessage NVARCHAR(4000);
  DECLARE @ErrorSeverity INT;
  DECLARE @ErrorState INT;

  SELECT 
     @ErrorMessage = ERROR_MESSAGE() + ' occurred at Line_Number: ' + CAST(ERROR_LINE() AS VARCHAR(50)),
     @ErrorSeverity = ERROR_SEVERITY(),
     @ErrorState = ERROR_STATE();

  RAISERROR (@ErrorMessage, -- Message text.
     @ErrorSeverity, -- Severity.
     @ErrorState -- State.
  );

END CATCH

6

実はこれ Error_number()は非常にうまく機能します。

この関数は、最後のGO(バッチ区切り)ステートメントからカウントを開始するため、Goスペースを使用していなくても、誤った行番号が表示されている場合は、7を追加します。自動的に使用されます。したがって、[Cast(Error_Number()+ 7 as Int)]を[Error_Number]として選択すると、目的の答えが得られます。


1
if you have not used any Go spaces and it is still showing a wrong line number - then add 7 to it, as in stored procedure in line number 7 the batch separator is used automatically.-これはどういう意味ですか?
underscore_d

4

TSQL /ストアドプロシージャ

次のようなエラーが発生する場合があります。

メッセージ206、レベル16、状態2、プロシージャmyproc、行177 [バッチ開始行7]

これは、エラーがバッチの177行目にあることを意味します。SQLでは177ではありません。バッチを開始する行番号(私の場合[7])を確認し、その値を行番号に追加して、どのステートメントが間違っているかを見つけます。


2

あなたはこれを使うことができます

CAST(ERROR_LINE() AS VARCHAR(50))

エラーログテーブルを作成したい場合は、これを使用できます:

INSERT INTO dbo.tbname( Source, Message) VALUES ( ERROR_PROCEDURE(), '[ ERROR_SEVERITY : ' + CAST(ERROR_SEVERITY() AS VARCHAR(50)) + ' ] ' + '[ ERROR_STATE : ' + CAST(ERROR_STATE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_PROCEDURE : ' + CAST(ERROR_PROCEDURE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR(50)) + ' ] ' +  '[ ERROR_LINE : ' + CAST(ERROR_LINE() AS VARCHAR(50)) + ' ] ' + ERROR_MESSAGE())

4
ERROR_LINE()は、ストアドプロシージャ内のTRY / CATCHのCATCH部分でのみ使用できることに注意してください。レポートされる行番号は、エラーをキャッチしなかった場合にSQL Serverが返す行番号と同じです。ですから、それは便利ですが、この質問を解決するのに役立ちません。
Rick

1

長い答え:行番号は、CREATE PROCEDUREステートメントからカウントされます。また、ステートメントを実際に実行したときに、その上にある空白行またはコメント行CREATEがカウントされますが、GOステートメントの前の行はカウントされません…

確認するために遊んでいるストアドプロシージャを作成する方がはるかに簡単であることがわかりました。

GO

-- =============================================
-- Author:          <Author,,Name>
-- Create date: <Create Date,,>
-- Description:     <Description,,>
-- =============================================
CREATE PROCEDURE ErrorTesting
       -- Add the parameters for the stored procedure here
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

       -- Insert statements for procedure here
       SELECT 1/0

END
GO

作成したら、に切り替えてALTER PROCEDURE、コメントの上と最初の上下に空白行を追加できます。GOステートメントのして、効果を確認できます。

私が気付いた非常に奇妙なことの1つEXEC ErrorTestingは、同じクエリウィンドウの下部で強調表示して実行するのではなく、新しいクエリウィンドウで実行しなければならないことでした。それが起こった理由がわからない..


1

あなたはこのようなcatchブロックでエラーメッセージとエラー行を得ることができます:

'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.