【发布时间】: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