代码之家  ›  专栏  ›  技术社区  ›  Graham Clark

SQL Server事件探查器中的存储过程输出参数

  •  9
  • Graham Clark  · 技术社区  · 14 年前

    我有一个存储过程 int 输出参数。如果我运行SQL Server Profiler,通过一些.NET代码执行存储过程,并捕获rpc:completed事件,则textData如下所示:

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

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

    2 回复  |  直到 10 年前
        1
  •  6
  •   edosoft    14 年前

    rpc:completed事件类指示远程过程调用已完成。所以输出参数在那一点上是已知的。查看跟踪rpc:started是否显示了您的期望。

        2
  •  5
  •   Tao    10 年前

    不管你怎么看,这都是一个错误。SQL事件探查器“textdata”的目的是使某人能够理解和重复存储过程调用。在这种情况下,运行这个T-SQL可以为您提供 完全不同 结果,如果 spStoredProcedure 过程有任何逻辑依赖于 @OutParam 参数,其中“13”的值作为输入值有某种意义。

    很容易看出它是如何方便的(使您能够看到proc调用的输出值,否则这将需要处理“rpc output parameter”事件),但它实际上是T-SQL等效执行的“谎言”。

    相关:我刚刚看到一篇来自Microsoft客户服务和支持团队的文章-关于另一个案例,即将rpc:completed事件的二进制数据转换为可显示的textdata值会导致原始rpc调用的不准确复制-这次是codepage问题:
    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 . 如果提供了非空值(并且参数在.NET sqlclient中的方向为“input output”),则该初始集将保留真正的输入值,而不是生成的输出值。但如果输入为空,则设置输出值。 这种观察支持这样一种观点,即这只是探查器rpc到tsql显示转换中的一个空处理错误。