「実際の」アプリケーションコードをデバッグできるように、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)
はい、これは痛みですが、特に便利ではありませんが、これは私が時間をかけて思いついたものです。私は正直なところ、現在の状態をテストしたり、テーブルの内容をチェックしたり、コードをステップ実行しながら突っ込んだりすると、ブロッキング、デッドロック、または他の誰かがデータベースを使用している同じ時間 - 私は、これまでに起こったことのない可能性を、私が担当していたどのプロダクションでも持っていないことを嫌っています。
どのような種類のストアドプロシージャですか? CLRプロシージャまたはTSQLプロシージャ? – Rad
私はC++で書かれた多くの拡張ストアドプロシージャを作成しました。そのCLR、TSQL、またはプレーンなC++がデバッグしようとしているprocsを保存しているかどうかを教えてください。 –
ストアドプロシージャはTSQLストアドプロシージャです – abhilash