我有一个带有一个int
输出参数的存储过程。如果我运行SQL Server Profiler,通过一些 .Net 代码执行存储过程,并捕获 RPC:Completed 事件,则 TextData 如下所示:
declare @p1 int
set @p1=13
exec spStoredProcedure @OutParam=@p1 output
select @p1
为什么看起来它在执行存储过程之前就获取了输出参数的值?我有一个带有一个int
输出参数的存储过程。如果我运行SQL Server Profiler,通过一些 .Net 代码执行存储过程,并捕获 RPC:Completed 事件,则 TextData 如下所示:
declare @p1 int
set @p1=13
exec spStoredProcedure @OutParam=@p1 output
select @p1
为什么看起来它在执行存储过程之前就获取了输出参数的值?RPC:Completed事件类表示远程过程调用已完成。因此,在那一点上实际上已知输出参数。请查看是否跟踪RPC:Started可以显示您期望的内容。
相关:我刚刚发现了一篇来自 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。