我正在尝试使用SQL Server Profiler(我正在使用SQL Server 2012)来生成有用的跟踪,以显示参数值,而不仅仅是显示带有变量名的SQL。该存储过程将遍历大量库存数据,以产生一些非常有价值的结果,而我正尝试记录现有行为,因此我可以对其进行单元测试,准确定义,然后将其重构为合理的形式。
我有一个执行54参数子过程的存储过程,该过程在一个循环内,在该循环中该存储过程创建一个游标,然后执行while循环。这是一个简化的视图:
CREATE PROCEDURE
[dbo].[OuterProcedure]
( @ProductCode varchar(8),
-- 41 more parameters omitted
)
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
-- OMIT ABOUT 10 temporary table declarations.
DECLARE aCursor CURSOR FAST_FORWARD FOR
SELECT [ID],bkno, -- about 40 fields omitted.
FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins
WHERE (about_80_boolean_expressions AND omitted_here)
ORDER BY some,keys,like,this
OPEN aCursor
FETCH NEXT FROM aCursor /* Get First Record */
INTO @ID, @about_40_fields,....
WHILE (@@FETCH_STATUS = 0) AND
( @About80MoreBooleanExpressionsHere)
BEGIN /* 1 */
-- about 700 lines of logic, math and if-parameter-this-then-that
-- stuff omitted
EXEC @ConsiderItem =
InnerProcedureCallWithinLoop
@from_locn,
@About53PARAMSOMITTED,
...
FETCH NEXT FROM CurInventory /* Get Next Record */
INTO @ID,@MoreStuff,...
END
CLOSE CurInventory
DEALLOCATE CurInventory
我如何获得跟踪以显示传递给我的所有参数值
InnerProcedureCallWithinLoop
?有54个参数。我是否必须在SQL内写“ 54行debug-printfs”,还是可以在进行SQL跟踪时转储过程调用的所有参数值?
当我现在获得跟踪时,得到以下输出:
EXEC @ConsiderItem = InnerProcedureCallWithinLoop @from_locn,
@About53ParmsOmitted
我想知道的是,@from_locn = 1
和@About53ParmsOmitted = 'hello world'
等。
这没有告诉我参数的实际值@from_locn
。对于第一个参数,它被传递到我的顶级存储过程中,所以我知道它是0或1(视情况而定)。但是,该内部过程中的43个参数中约有40个来自循环FETCH NEXT FROM aCursor
内的操作WHILE
。
现在,跟踪告诉我InnerProcedureCallWithinLoop
调用了多少次,每个调用花费了多长时间,但没有告诉该调用的参数值是多少。如果我能以某种方式获得“可运行的独立SQL脚本”来复制我在代码中发现的一些特殊情况,同时在这些脚本中进行跟踪,设置这些总功能(我知道,有54个参数,那确实很重要,但是我没有写它们!)可能要花我一个小时的时间才能建立一个SQL脚本,让我自己在这个SQL Server存储过程如此庞大的咆哮之外自己调用这种极端情况。
这是深入研究SQL表达式并构建可探查这些复杂存储过程的脚本的全部工作。
更新我找到了RPC“输出参数”记录选项,但没有找到“ RPC IN PARAM”记录选项。