我有一个带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显示了您的期望.
无论你如何看待它,这都是一个错误.SQL事件探查器"TextData"的目的是使某人能够理解并重复存储过程调用.在这种情况下,如果过程具有依赖于参数的输入值的任何逻辑,则运行此T-SQL可以给出完全不同的结果,其中该值"13"在某种程度上有意义作为输入值.spStoredProcedure
@OutParam
很容易看出它是如何方便的(让你看到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调用中该参数的输入值是,则探查器将只使用这个不正确的初始SET Null
.如果提供了非空值(并且该参数在.Net SqlClient中具有方向"InputOutput"),则该初始SET保持真实输入值,而不是结果输出值.但是如果输入为null,则设置输出值.这种观察支持这样的概念:这只是分析器RPC-to-TSQL显示转换中的空处理错误.