War*_* P 13 sql-server stored-procedures profiler sql-server-2012
使用 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
Run Code Online (Sandbox Code Playgroud)
我如何获得跟踪以显示传递给的所有参数值
InnerProcedureCallWithinLoop?有54个参数。我是否必须在我的 SQL 中编写“54 行 debug-printfs”,或者我可以在执行 SQL 跟踪时转储过程调用的所有参数值吗?
当我现在得到跟踪时,我得到这个输出:
EXEC @ConsiderItem = InnerProcedureCallWithinLoop @from_locn,
@About53ParmsOmitted
Run Code Online (Sandbox Code Playgroud)
我想知道的是,@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”记录选项。
我硬着头皮告诉你,不能设置这样的痕迹,因为这不是痕迹的[感知]目的。我一直是这样做的:
WHILE (@@FETCH_STATUS = 0) AND
( @About80MoreBooleanExpressionsHere)
BEGIN /* 1 */
-- 大约 700 行逻辑、数学和 if-parameter-this-then-that
-- 省略了
INSERT InnerProcedureCallWithinLoop__TraceTable
VALUES (@from_locn, @ About53PARAMSOMITTED
EXEC @ConsiderItem =
InnerProcedureCallWithinLoop
@from_locn,
@About53PARAMSOMITTED,
...
如果我知道它只能从一个位置调用。否则,我会在被调用者而不是调用者中执行此操作。
ALTER PROC InnerProcedureCallWithinLoop
@from_locn int,
@About53PARAMSOMITTED ...
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
INSERT InnerProcedureCallWithinLoop__TraceTable VALUES (@from_locn, @prm2, @prm3....
--- rest of proc
Run Code Online (Sandbox Code Playgroud)
这与使用跟踪明显不同,跟踪能够捕获事件,即使它们开始并从未完成(错误参数、回滚事务)。如果这是您的问题,您需要查看 CLR 或电子邮件方法来外部化捕获的输出。
| 归档时间: |
|
| 查看次数: |
4360 次 |
| 最近记录: |