2009-07-15 54 views
4

ストアドsprocのデバッグが脅威になる可能性があります。&イミディエイトウィンドウを私が思ったように使用することができませんでした。Visual Studio 2005のストアドプロシージャをデバッグ中のイミディエイトウィンドウ

VS 2005のStored Procsのデバッグ中にイミディエイトウィンドウを使用できますか?

私はストアドプロシージャ内で作成しているテンポラリテーブルでクエリを実行できる他の方法はありますか?テンポラリテーブルのスコープはストアドプロシージャ内にのみ存在するため、定義します。

私はPS

TSQLストアド手続きオブジェクトをデバッグしていながら、私はテーブルを照会するデバッガビジュアライザを作成することができます。私はあなたがこの中でする必要がありませんようにアーチアプリケーションに良い方法があります知っています状況が、私はいくつかの慈悲をしてくださいいくつかの慈悲をしてください);

+1

どのような種類のストアドプロシージャですか? CLRプロシージャまたはTSQLプロシージャ? – Rad

+0

私はC++で書かれた多くの拡張ストアドプロシージャを作成しました。そのCLR、TSQL、またはプレーンなC++がデバッグしようとしているprocsを保存しているかどうかを教えてください。 –

+0

ストアドプロシージャはTSQLストアドプロシージャです – abhilash

答えて

0

あなたの格納されているprocsがoracleにある場合、あなたはoracle sqlの開発者によって提供されるデバッグ機能を使用することができます。このツールを使用すると、いつでも必要に応じてブレークポイントを設定して、procsをコンパイルしてデバッグすることができます。保存されたprocがpl sqlで書かれている場合は、これを盲目的に実行してください。私のプロジェクトでは、私はVisual Studioからストアドプロシージャをデバッグしません。代わりに、私は格納されたprocに渡される入力を保持し、そのツールに移動し、そのinput.AFAIKでデバッグモードでprocを実行すると、VSからのデバッグ中に一時テーブルを照会することはできません。

2

「実際の」アプリケーションコードをデバッグできるように、SQLストアドプロシージャをデバッグできるようになったとは聞いたことがありません。 (これは7.0、2000、2005をカバーしていますが、審査員はまだ2008年です)。

よく知られていないストアドプロシージャ(私が書いた数ヶ月後のもの)で深刻なデバッグを行う必要があるときは、コードをSSMSクエリウィンドウに貼り付け、適切なDECLAREとSET 、問題文(RETURN)をコメントアウトして実行します。ほとんどの場合、実行後に一時テーブル(@テーブル変数ではなく#一時テーブル)がそこに残っています。 #を##で検索して置き換えると、それらをグローバルにして他のクエリウィンドウからアクセスすることができます。コードのブロックをコメントアウトし、コメントのないセクションを実行することは非常に便利です。

私は真剣に醜い手続き(数百、あるいはコードの行数千)のためにやったいくつかの他のトリック:手順の適切なセクション0に不履行、

パラメータ@Debugの追加は、IF」を追加します@Debug = 1 "ブロックで、現在の変数値や一時テーブルの内容を出力することができます。有用な形態があることができます:あなたが最初のクエリウィンドウに#TEMPテーブルを作成した場合、これにより

IF @Debug = 0 or object_id('tempdb.dbo.#MyTempTable') is null 
    CREATE TABLE #MyTempTable 
    (
     ProductId int not null 
     ,etc 
    ) 

SELECT 'DebugBlock3' DataSet, * from #MyTempTable 

この上のビル、別のトリックはそうのような#TEMPテーブルを定義することです、そして同じウィンドウから@Debug = 1のプロシージャーを呼び出すと、プロシージャーが完了しても、テンポラリ・テーブルはそこに残り、最終的な内容が何であっても読み込まれます。

動的コード(身震い)で作業する場合、私は不変@Debugは値0、1で動作するように設定され、2、コメントなどの

-- Debug control: 0=do the work, 2=List out dynamic code, 1=Both 

とその後のコードブロックとのガット:

IF @Debug > 0 
BEGIN 
    PRINT 'Comment about the following chunk of text' 
    PRINT '-----------------------------------------------------------' 
    PRINT @Command 
END 
IF @Debug < 2 
    EXECUTE (@Command) 

はい、これは痛みですが、特に便利ではありませんが、これは私が時間をかけて思いついたものです。私は正直なところ、現在の状態をテストしたり、テーブルの内容をチェックしたり、コードをステップ実行しながら突っ込んだりすると、ブロッキング、デッドロック、または他の誰かがデータベースを使用している同じ時間 - 私は、これまでに起こったことのない可能性を、私が担当していたどのプロダクションでも持っていないことを嫌っています。

+0

Visual Studioでは、「ほとんどの」実際のコード(http://msdn.microsoft.com/en-us/library/zefbf0t6%28VS.71%29)のようなストアドプロシージャをデバッグできます。 aspx – abhilash

+0

あなたのリンクによると、十分に公正ですが、セットアップするのはちょっと面倒です。ステップスルーの間に一時テーブルのデータにアクセスできない場合は、これらの回避策が必要になるようです。 –

0

私は、デバッグの目的で、その中にPrintステートメントを含むストアドプロシージャを書く傾向があります。

その後、ストアドプロシージャを実行する前に、SqlConnections情報メッセージにフックしてから、返されたメッセージのDebug.Writeを実行します。あなたを照会し、一時テーブルの場合

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.infomessage%28VS.71%29.aspx

は、グローバルな一時テーブル http://www.sqlteam.com/article/temporary-tables

それらを作るデバッグしながら、これを使用すると、ストアドプロシージャの外でそれらを照会することができることを意味でしたが、それでも彼らは一時テーブルとして認識しています。グローバルなテンポラリテーブルは#の代わりに##という名前です。

1

この機能は、残念ながらイミディエイトウィンドウでは実装されていません。私はそれがVisual Studioの任意のバージョンにあったとは思わない

関連する問題