このストアドプロシージャを検討してください。手順の実際の内容は重要ではありません。例のためにのみ使用しています。
CREATE PROCEDURE [dbo].[temp]
@value1 varchar(50),
@value2 varchar(50),
@value3 varchar(50)
as
begin
Select *
From valuesTable (nolock)
inner join valuesTable2 RL (nolock)
on (ValuesTable.ID = RL.RuleId and RL.Type = 'Something')
where @value1 = ValuesTable.RuleVal02
and cast(@value2 as float) > cast(ValuesTable.RuleVal03 as float) and cast(@value2 as float) < cast(ValuesTable.RuleVal04 as float)
--and (@value3 = ValuesTable.RuleVal05)
and (@value3 = ValuesTable.RuleVal05 or ValuesTable.RuleVal05 = -1)
end
ここで、これ(それほど複雑ではない関数)が機能していないと想像してください。VisualStudioとSQLServerManagement Studioの両方からデバッグする方法はすでに知っていますが、どちらの場合も不足しています。
この関数の主な失敗点は、実行する大きなクエリです。次に、このクエリを取得し、新しいクエリウィンドウにコピーして実行を開始し、さまざまな部分を変更してデバッグします。
そのクエリをデバッグする基本的な方法は、クエリを新しいクエリウィンドウにコピーし、実行中のコードからパラメータを取得してから、すべてを手動で@variables
実際の値に置き換えることです。それは機能しますが、私には非常に不必要な作業のように思われます。サーバーで実行されるため、理想的にはクエリを取得したいと思います。たとえば、パラメータの代わりにリテラル値を使用します。
where 'actualValue' = ValuesTable.RuleVal02
and cast(4.2 as float) > cast(ValuesTable.RuleVal03 as float) and cast(4.2 as float) < cast(ValuesTable.RuleVal04 as float)...
プロファイラーでしか実現できないように聞こえたので、立ち上げました。次に、イベントをキャプチャするようにイベントを構成してSP:StmtStarting
、ストアドプロシージャから実行されたステートメントを確認しました。ただし、驚いたことに、プロファイラーに表示されるステートメントは、実際のリテラル値ではなく、パラメーターとともに表示されます。
パラメーターをパラメーターのリテラル値に置き換えて、ストアドプロシージャで実行される実際のクエリを簡単にコピーする方法はありますか?プロファイラーにそうするためのフラグがありますか?または別の方法はありますか?