2010-12-07 2 views
11

log4netスタイルデバッグ情報をストアドプロシージャのセットに追加することに最も近いものは何ですか?プロシージャの中には、他のプロシージャに作業を委任するものもあれば、両方からのトレース情報が必要なものもあります。Sql Server(2008)のストアドプロシージャにトレース/デバッグ出力を追加する方法

開発中にprintとselect文を振りかざしてしまいました。正常なトラブルシューティング操作であるかどうかに応じて、さまざまなモードでprocを実行したいと思っています。

この場合、プライマリストアドプロシージャはエージェントジョブから繰り返し実行されますが、トラブルシューティングの際に管理スタジオから実行される可能性があります。

procsはすでにエラーログテーブルと電子メール機能を使用して、発生したエラーをキャッチします。私が追跡できるようにするために探しているのは、入力データの問題が出力データが間違っているが、procsが完全に失敗しないことを意味し、各ステップで何が行われたのかを正確に見ることが有用な場合があります。

意味のある理想的なフィルタリング可能な出力を得るためのアプローチは何ですか?答えは1

一つ、私たちは、次のような箱のうち、ファイナルランキング;-)

の答えは歓迎し、見ることができるように -

+0

多分これはSO http://stackoverflow.com/questions/3829201/sql-select-print-out-results-of-stored-procedue/3832356を助けることができます#3832356 – adopilot

答えて

13

例えば

print 'Doing something...' 
INSERT INTO foo(a) VALUES(1) 
print @@ROWCOUNT 

ちょうどバランスのためにこの答え、それはここで静かなラウンドだと見て。

+1

私は、[[dbo]。[PrintMessage] 'アプローチを使いやすくしています。とオフ。 –

+0

私は同意します。一般的な意見を一番上に置いておきます。 –

+0

@TimAbellこれらのprint文の出力は、トラブルシューティングのためにSQL Serverのどこにでもありますか? – Antoops

7

ワン「はありませんあなたがする必要がある時に管理スタジオでステップ実行します」 SSMSからprocが実行されているかどうかを確認し、もしあればCustom user configurable SQL Server Profiler eventsを起動することが考えられます。例えば

CREATE PROC foo 
AS 
DECLARE @debug bit = CASE WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' 
          THEN 1 
          ELSE 0 END 

DECLARE @userinfo nvarchar(128) 
DECLARE @userdata varbinary(8000) 

--Do some work here 

IF @debug = 1 
BEGIN 
--Do some custom logging 
    SET @userinfo = N'Some custom info' 
    SET @userdata = CAST('Some custom data' AS varbinary(8000)) 
    EXEC sp_trace_generateevent @eventid = 82 /*Use 82-91*/ 
           ,@userinfo = @userinfo 
           ,@userdata = @userdata 

END 

実際に私は通常、以下のようなものを使用していますが。場合によっては、必要に応じてメッセージをログに記録する追加のコード(場合によってはステップとステータス値も含む)をテーブルに追加することがあります。これにより、「フィルタリング可能」要件を満たすことができます。

APP_NAMEが(英語版)SSMSで実行されており、NOWAITを使用していることを示す場合を除き、メッセージが印刷されなくなるため、バッファがいっぱいになるのを待つのではなく、メッセージがすぐに印刷されます。 print文の

CREATE PROCEDURE [dbo].[PrintMessage] @message   NVARCHAR(MAX), 
             @PrependCurrentTime BIT = 0 
AS 
    IF APP_NAME() LIKE 'Microsoft SQL Server Management Studio%' 
     BEGIN 
      DECLARE @CurrentTimeString VARCHAR(30); 

      SET @CurrentTimeString = '' 

      IF @PrependCurrentTime = 1 
      BEGIN 
       SET @CurrentTimeString = CONVERT(VARCHAR(19), GETDATE(), 20) + ' ' 
      END 

      RAISERROR('%s%s',0,1,@CurrentTimeString,@message) WITH NOWAIT 

     END 
+0

http://msdn.microsoft.com/en-us/library/ms177548.aspx msdn ref –

+1

nb。これには、運用環境では利用できない特権が必要です。 (私は難しい方法を見つけ出しました!) –

+0

2番目の部分をそれ自身の答えに分割する価値があります。 –

1

トレース出力を追加するのではなく、必要に応じてSQL Server管理スタジオデバッガでステップスルーします。

(人々はこれを好むかどうかを確認するために追加しました)

関連する問題