4

このストアドプロシージャを検討してください。手順の実際の内容は重要ではありません。例のためにのみ使用しています。

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、ストアドプロシージャから実行されたステートメントを確認しました。ただし、驚いたことに、プロファイラーに表示されるステートメントは、実際のリテラル値ではなく、パラメーターとともに表示されます。

パラメーターをパラメーターのリテラル値に置き換えて、ストアドプロシージャで実行される実際のクエリを簡単にコピーする方法はありますか?プロファイラーにそうするためのフラグがありますか?または別の方法はありますか?

4

2 に答える 2

2

次の簡単なワークフローを試してください (所要時間 5 秒):

  1. SSMS を実行します。
  2. オブジェクト エクスプローラー ウィンドウでストアド プロシージャを見つけます。
  3. それを右クリックしてコンテキスト メニューを表示し、そこから [ストアド プロシージャの実行...] を選択します。
  4. 表示されたフォームですべてのパラメータ値を設定します。
  5. SSMS は、新しいクエリ タブでスクリプトを生成します (この回答の最後にあるスクリプトを参照してください)。
  6. 後で使用するために、このスクリプトを保存します。
  7. デバッグを実行 -> このスクリプトのデバッグを開始し、EXEC ステートメントにステップ インします。
  8. パラメータ値を変更し、次のデバッグを実行します。
DECLARE @return_value int

EXEC    @return_value = [dbo].[temp]
        @value1 = N'1',
        @value2 = N'2',
        @value3 = N'3'

SELECT  'Return Value' = @return_value
GO
于 2013-01-30T20:25:43.493 に答える
1

実際の値の代わりにプレースホルダーを使用して変数にクエリを記述し、実行時にプレースホルダーを置き換えて sp_executesql で実行することができます

明らかに、これは本番環境ではなく、デバッグ目的で行うべきことです ;)

例を次に示します: http://sqlfiddle.com/#!3/c8c43/5

そこで、変数内に実際のコンテンツで満たされたクエリがあります

于 2012-11-14T16:52:53.057 に答える