SQL Server Profiler中的存储过程输出参数

11

我有一个带有一个int输出参数的存储过程。如果我运行SQL Server Profiler,通过一些 .Net 代码执行存储过程,并捕获 RPC:Completed 事件,则 TextData 如下所示:

declare @p1 int
set @p1=13
exec spStoredProcedure @OutParam=@p1 output
select @p1
为什么看起来它在执行存储过程之前就获取了输出参数的值?

为什么会这样显示?问题在哪里? - Mitch Wheat
嗯,它的显示方式使它看起来像是在执行存储过程之前神奇地猜测输出参数的值。显然这不是正在执行的命令序列,所以我只是想知道为什么会以这种方式显示。 - Graham Clark
2个回答

7

RPC:Completed事件类表示远程过程调用已完成。因此,在那一点上实际上已知输出参数。请查看是否跟踪RPC:Started可以显示您期望的内容。


好的,我明白,在RPC:Started事件中,@p1变量被设置为NULL。我想这是有道理的。 - Graham Clark
我相信这是一个错误(并添加了一个回答),你有任何迹象表明这是预期的行为吗?我找不到任何相关文档。 - Tao

5
这是一个明显的错误,无论从哪个角度来看。SQL Profiler中“TextData”的意图是为了让人们理解和重复存储过程调用。在这种情况下,如果spStoredProcedure过程依赖于@OutParam参数的输入值逻辑,并且该值“13”在某种程度上作为输入值有意义,那么运行此T-SQL可能会给您带来完全不同的结果。
很容易看出它的方便之处(可以让您查看proc调用的输出值,否则需要使用“RPC输出参数”事件),但实际上它是一种“谎言”,因为它并没有执行等效的T-SQL。

相关:我刚刚发现了一篇来自 Microsoft 客户服务和支持团队的文章,讨论了另一个情况——将 RPC:Completed 事件的 BinaryData 转换为可显示的 TextData 值会导致原始 RPC 调用的不准确再现——这次是编码问题:
http://blogs.msdn.com/b/psssql/archive/2008/01/24/how-it-works-conversion-of-a-varchar-rpc-parameter-to-text-from-a-trace-trc-capture.aspx

更新:通过实验,我发现了行为的另一个奇特之处——只有在 RPC 调用中该参数的输入值为 null 时,分析器才会使用此不正确的初始 SET。如果提供了非空值(并且在 .Net SqlClient 中,该参数具有 “InputOutput” 方向),那么初始 SET 将保留真实的输入值而不是结果输出值。但是如果输入为空,则输出值将被设置。 这一观察结果支持了这一点:这仅仅是分析器 RPC-to-TSQL 显示转换中的一个处理 null 的 bug。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接