2009-03-03 81 views
10

我想我遇到了与kcrumley在问题“Problem calling stored procedure from another stored procedure via classic ASP”中描述的相同的问题。但是他的问题并没有真正包括解决方案,所以我给它一个镜头,加上我自己的观察:MS SQL:抑制存储过程中调用的存储过程的返回值

我有两个存储过程:

CREATE PROCEDURE return_1 AS BEGIN 
    SET NOCOUNT ON; 
    SELECT 1 
END 

CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN 
    SET NOCOUNT ON; 
    EXEC return_1 
    SELECT 2 
END 

注意,这两个程序包含“SET NOCOUNT ON ”。当我执行“call_return_1_and_return_2”时,我仍然得到两个记录集。首先是值1,然后是值2.

这会导致ASP(经典的VBScript ASP)离开轨道。

任何提示我如何能抑制第一个结果集?为什么即使使用NOCOUNT,它也存在?

跳过ASP中的第一个记录集不是一个选项。我需要一个“仅数据库”解决方案。

+0

一对夫妇的响应指出,可以从选择更改来一回,但是这是一个很大的问题 - 如果嵌套的存储过程必须选择,因为别的东西的话来说,你不能改变它?我想知道是否有可能“吞下”这样的结果集。 – 2009-03-03 11:34:41

回答

8

它不是导致这种情况的NOCOUNT,您的存储过程每个都有一个选择,因此每个都有自己的结果集。这可以通过更改第一个存储过程以避免使用输出参数将数字1传回而不是执行选择来避免。第二个存储过程可以检查输出参数以获取运行所需的数据。

尝试这样的事情

CREATE PROCEDURE Proc1 
(
    @RetVal INT OUTPUT 
) 
AS 
SET NOCOUNT ON 
SET @RetVal = 1 


CREATE PROCEDURE Proc2 
AS 
SET NOCOUNT ON 
DECLARE @RetVal int 
EXEC [dbo].[Proc1] 
     @RetVal = @RetVal OUTPUT 
SELECT @RetVal as N'@RetVal' 
2

那些不返回变量,但输出记录集。我猜,只要SQL服务器将输出刷新到客户端,就会被搞砸,无法收回。

我会通过向SP return_1添加一个参数来解决这个问题,这将控制return_1是否选择记录或者只是执行某些操作并以静默方式退出。

12

正如马特在他的评论中指出的那样,这两种解决方案都不能真正“吞下”第一个结果集。 我不知道你为什么想要这个,但是你可以通过使用一个表变量'吞下'第一个exec的结果。它必须匹配结果集列的确切数量和类型。像这样:

CREATE PROCEDURE return_1 AS 
    SET NOCOUNT ON; 
    SELECT 1 
GO 
CREATE PROCEDURE call_return_1_and_return_2 AS 
    SET NOCOUNT ON; 
    DECLARE @Result TABLE (res int) 
    insert into @Result EXEC return_1 
    SELECT 2 
GO