2016-06-16 3 views
1

は、tsqlで何かを達成するための少しの助けが必要です。 私はSQLプロファイラのトレースデータを収集して特定のストアドプロシージャの実行を取得していますが、基本的にはtextdataカラムからパラメータ値を取り除こうとしています 以下のデータセットの例はパラメータ値をストライピングする必要がありますパラメータスニッフィングのトラブルシューティング

exec test 
exec test @aa=10 
exec test @aa=10,@bb=10 
exec test @aa=10,@bb=10,@cc=100 
exec test @aa=10,@bb=1000,@cc=1 
ので、出力テーブルには、

aa bb  cc 
10 Null NUll 
10 10 NULL 
10 10 100 
10 1000 1 

は、私はちょうどそれが聞かせくださいやって、他の簡単な方法があるので、もしSPに渡されている共通パラメータは、あるものを見つけることを試みているように見えるかもしれません私は知っている。私はオフに考えることができ

答えて

2

いくつかの方法..

1.usingのプランキャッシュ

select query_plan from sys.dm_exec_cached_plans cp 
cross apply 
sys.dm_exec_text_query_plan(cp.plan_handle,default,default) 
where objtype='proc' and object_name(objectid)='usp_test' 

今すぐ上記のクエリプランは非常にいくつかを乗器れるすべてのvalues used at compile time .This手順が含まれますxmlですし、 many reasonsのために発生する可能性のあるプランキャッシュの無効化のために時間がかかります。

2.ストアドプロシージャを変更して、他のテーブルにすべてのパラメータ値を挿入します。ティ

create proc usp_test 
(
@a int=1, 
@b int =2 
) 

as 
begin 
insert into sometable 
select @a,@b,getdate() 
end 
上記以外

以下のようにngの方法を言った、私はあなたがトラブルシューティングするために探している場合あなたは(あなたが実行しているトレースを除く)渡されたパラメータ値

を得ることが可能なオフ考えることができる方法はありませんパラメータスニッフィング、すべてのパラメータ値を収集することによって、これは正確な方法ではない可能性があります

+0

こんにちは、次のように応答してくれてありがとうをあなたのPROCを作ることができます。 オプション2は実行できません。私はoption1を見ています。 しかし、トレースを使用してパラメータ値を取得しなかったという点について、少し混乱しています。 sp_completeイベントでトレースを実行すると、パラメータ値を取得できます。実際のパラメータ値を取得する際に間違ったことをしないように確認してください。 – jesijesi

+0

私はどこでその声明を出したのか教えていただけますか? – TheGameiswar

+1

私の悪い、何らかの理由で除外するのではなく「含む」と読む – jesijesi

0

私が理解しているのは、パラメータスニッフィングの問題を克服したいということです。

あなたは、

create proc usp_test 
(
@aa int, 
@bb int , 
@cc int 
) 

as 
begin 

    DECLARE @aa1 INT 
    SET @aa1 = @aa 
    DECLARE @bb1 INT 
    SET @bb1 = @bb 
    DECLARE @cc1 INT 
    SET @cc1 = @cc 


select col1,col2 from testtable 
    where [email protected] and [email protected] 

end 

https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/

https://blogs.technet.microsoft.com/mdegre/2011/11/06/what-is-parameter-sniffing/

関連する問題