我有一个带有int
输出参数的存储过程。如果我运行SQL Server Profiler,通过一些.Net代码执行存储过程,并捕获RPC:Completed事件,TextData如下所示:
declare @p1 int
set @p1=13
exec spStoredProcedure @OutParam=@p1 output
select @p1
为什么它在执行存储过程之前看起来像是获取输出参数的值?
答案 0 :(得分:6)
RPC:Completed事件类表示已完成远程过程调用。因此,输出参数实际上是已知的。查看是否跟踪RPC:Started显示了您的期望。
答案 1 :(得分:5)
无论你如何看待它,这都是一个错误。 SQL事件探查器“TextData”的目的是使某人能够理解并重复存储过程调用。在这种情况下,如果spStoredProcedure
过程具有依赖于@OutParam
参数的输入值的任何逻辑,则运行此T-SQL可以为您提供完全不同的结果。 “13”的值在某种程度上是有意义的输入值。
很容易看出它是如何方便的(让你看到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保持真实输入值,而不是结果输出值。但是如果输入为null,则设置输出值。
这种观察支持这样的概念:这只是分析器RPC-to-TSQL显示转换中的空处理错误。