当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《SQLServerProfiler中的存储过程输出参数》经验,为你挑选了2个好方法。

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

declare @p1 int
set @p1=13
exec spStoredProcedure @OutParam=@p1 output
select @p1

为什么在执行存储过程之前它看起来像是获取输出参数的值?



1> edosoft..:

RPC:Completed事件类指示已完成远程过程调用.因此,输出参数实际上是已知的.查看是否跟踪RPC:Started显示了您的期望.



2> Tao..:

无论你如何看待它,这都是一个错误.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显示转换中的空处理错误.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有