SQL Server 2012存储过程输出被包含的过程的结果集中断

时间:2014-10-03 17:03:01

标签: sql sql-server wcf tsql stored-procedures

长期读者,第一次海报。

在我们将应用程序的数据库从dev迁移到测试,再到我们最近上线的生产之后,我们在SQL Server 2012的生产实例中观察到了一些奇怪的东西。

我们从WCF Web服务调用了许多存储过程来做各种操作;一些返回结果集,其他则没有。

其中一些程序调用其中的其他(子)程序。这些子过程定义了OUTPUT参数。在dev和test中调用父过程时,它们按预期执行,返回的结果集是最终的select语句。

但是在我们的生产环境中,父程序在调用时运行完成,但它们不像以前那样返回预期的结果集,而是返回子程序的 OUTPUT参数。

以下是我们展示此问题的一个程序的示例摘录:

CREATE PROCEDURE [dbo].[CHANGE_USER_DEPTID]

@USERID VARCHAR(10),
@DEPTID VARCHAR(10)

AS
BEGIN

SET NOCOUNT ON;

DECLARE @ALTERNATEUSERID VARCHAR(10)
DECLARE @EMPLID INT

EXEC GET_ALTERNATEUSERID_SP @USERID, @ALTERNATEUSERID OUTPUT

SELECT @EMPLID = EMPLID FROM ACTIVEDIRECTORY_VW WHERE ALTID = @ALTERNATEUSERID

...DO SOME VARIOUS PROCESSING...

UPDATE DEPARTMENT_TABLE
SET EMPLID = ...
WHERE ...

END

好的,所以这个程序的最终语句是一个更新,在我们的开发和测试环境中,当调用这个CHANGE_USER_DEPTID过程时,它只返回“Command(s)Completed Successfully”。但是在我们的生产环境中,该过程返回一个结果集; @ALTERNATEUSERID,它是子过程的输出参数。怎么可能?主程序永远不会选择那个变量,主程序甚至没有定义输出参数。

对于WCF服务中的某些调用,这不是什么大问题,因为.NET方法在cmd.ExecuteNonQuery()语句中使用它们。但它导致其他一些问题,我们期望最终的select语句在过程结束时返回某个结果集(例如,一个整数),而是返回子过程的输出参数(比如说) ,一个字符串),这导致各种事情进一步爆炸。

有没有人曾经历过,或者甚至听到这个问题?

1 个答案:

答案 0 :(得分:0)

总结一下:

事实证明,父程序中的一个子存储过程(大约三级)在最后有一个额外的SELECT语句,有人为了测试目的而取消注释。这个额外的select语句在最顶层的存储过程中一直向上返回。