考虑这个存储过程。程序的实际内容无关紧要,我只是为了这个例子而使用它:
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
现在想象一下这个(不是很复杂的功能)不起作用。我已经知道如何从Visual Studio和SQL Server Management 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
事件,以查看从存储过程执行的语句。然而,令我惊讶的是,我在分析器中看到的语句仍然显示其参数而不是实际的文字值。
是否可以轻松复制在存储过程中执行的实际查询,并将参数替换为参数的文字值?分析器中是否有标志可以这样做?或者还有另一种方式吗?
答案 0 :(得分:1)
您可以在变量中编写查询,使用占位符而不是实际值,在运行时替换占位符并使用sp_executesql执行它
显然,这只是你应该为调试而不是在生产中做的事情;)
这是一个例子:http://sqlfiddle.com/#!3/c8c43/5
在变量
中,您的查询中填充了实际内容答案 1 :(得分:1)
尝试这个简单的工作流程(需要5秒钟):
DECLARE @return_value int
EXEC @return_value = [dbo].[temp]
@value1 = N'1',
@value2 = N'2',
@value3 = N'3'
SELECT 'Return Value' = @return_value
GO