在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的常见参数是什么,所以如果有其他简单的方法可以告诉我。
答案 0 :(得分:2)
几乎没有什么方法可以让我想一想..
1.使用计划缓存
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'
现在上面的查询计划是一个xml,它将包含所有values used at compile time。这个程序非常有一些,你只会获得编译的值。但由于计划缓存失效而导致的时间由于{ {3}},随着时间的推移,您将获得新的值
2.修改你存储的proc以将所有param值插入到其他表中,如下面的
create proc usp_test
(
@a int=1,
@b int =2
)
as
begin
insert into sometable
select @a,@b,getdate()
end
除了上述方法之外,我无法想象你可以获得传递的参数值(排除正在运行的跟踪)
如果您希望对参数嗅探进行故障排除,通过收集所有参数值,这可能不是准确的方法
答案 1 :(得分: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 col1=@aa1 and col2=@bb1
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/