【问题标题】:Why am I getting inconsistent results with conditional SET NOCOUNT ON in stored procedure called by WebSphere Message Broker?为什么在 WebSphere Message Broker 调用的存储过程中使用条件 SET NOCOUNT ON 得到不一致的结果?
【发布时间】:2014-07-10 07:46:21
【问题描述】:

我正在为 IBM WebSphere Message Broker 编写一些流程,这些流程调用远程 Microsoft SQL Server 数据库上的存储过程。我的问题是我有时会得到应该返回的结果集,有时却什么也得不到。

存储过程中似乎引起问题的行是:

IF (@noCountInd > 0)
    SET NOCOUNT ON;

当我从 Message Broker 中的数据库节点调用存储过程时,它会在第一次调用时返回结果集,然后在后续调用中返回任何内容。如果SET NOCOUNT ON 是无条件的,它每次都有效。如果通过 SQL Server Management Studio 命令行调用,即使在上述条件下,它也每次都能正常工作。

似乎在调用 Message Broker 以关闭其数据库连接之间经过了足够的时间后,下一次使用新连接的调用将成功。

这是我产生此问题的精简代码:

存储过程

CREATE PROCEDURE dbo.pTestConditionalNoCount
    @noCountInd bit = 0
AS

IF (@noCountInd > 0)
    SET NOCOUNT ON;

SELECT 'Success' AS RESULT;

RETURN 0;

数据库节点中的 ESQL

CREATE DATABASE MODULE testConditionalNoCount
    CREATE FUNCTION Main() RETURNS BOOLEAN
    BEGIN
        CALL pTestConditionalNoCount(TRUE,
            Environment.Variables.testConditionalNoCount.Results.Row[])
            IN Database.{'DATABASE_NAME'}.{'dbo'};      
        RETURN TRUE;
    END;

END MODULE;

CREATE PROCEDURE pTestConditionalNoCount(IN testNoCountInd BOOLEAN)
    LANGUAGE DATABASE
    DYNAMIC RESULT SETS 1
    EXTERNAL NAME pTestConditionalNoCount;

跟踪节点的输出

Environment: ( ['MQROOT' : 0x29692478]
  (0x01000000:Name):Variables = (
    (0x01000000:Name):testConditionalNoCount = (
      (0x01000000:Name):Results = (
        (0x01000000:Name):Row = (
          (0x03000000:NameValue):RESULT = 'Success' (CHARACTER)
        )
      )
    )
  )
)
Environment: ( ['MQROOT' : 0x29692478]
  (0x01000000:Name):Variables = (
    (0x01000000:Name):testConditionalNoCount = (
      (0x01000000:Name):Results = 
    )
  )
)
Environment: ( ['MQROOT' : 0x29692478]
  (0x01000000:Name):Variables = (
    (0x01000000:Name):testConditionalNoCount = (
      (0x01000000:Name):Results = 
    )
  )
)

SQL Server 的版本是 Microsoft SQL Server 2005 - 9.00.5324.00 (X64),消息代理是 IBM WebSphere Message Broker 8.0.0.2。

有人知道这里发生了什么吗?

更新

我运行了一个 ODBC 跟踪,它显示了在失败情况下返回的两个结果集。第一个是空的,第二个是我期望的结果集。

调用过程的方式似乎没有区别。每次调用都会记录一个 SQLExecute,然后是一个 SQLNumResultCols,如果有效则返回 1,否则返回 0。

【问题讨论】:

  • SET NOCOUNT ON 仅适用于存储过程的生命周期。存储过程完成后,该设置将恢复为原始会话设置。我怀疑在应用程序或 API 层处理(错误)行计数消息的方式存在问题,但我对 WebSphere Message Broker 一无所知。

标签: sql-server stored-procedures messagebroker


【解决方案1】:

我怀疑这与存储过程对象的缓存有关,这就是为什么当您让连接空闲时您会再次看到调用工作的原因。

可能值得检查 2 次后续调用的 ODBC 跟踪,看看这 2 次执行之间是否有任何差异(当然除了没有结果)。

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2010-11-12
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多