12

我认为我遇到了与 kcrumley 在问题“通过经典 ASP 从另一个存储过程调用存储过程的问题”中描述的问题相同的问题。但是他的问题并没有真正包括解决方案,所以我再试一次,添加我自己的观察:

我有两个存储过程:

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 中的第一个记录集不是一种选择。我需要一个“仅限数据库”的解决方案。

4

3 回答 3

15

正如马特在他的评论中指出的那样,这两种解决方案都没有真正“吞下”第一个结果集。我不知道你为什么想要这个,但你可以通过使用表变量“吞下”第一个 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
于 2009-03-03T16:13:59.907 回答
10

它不是导致这种情况的 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'
于 2009-03-03T11:26:26.600 回答
2

这些不是返回变量,而是输出记录集。我想一旦 SQL Server 将输出刷新到客户端,你就完蛋了,无法收回。

我将通过向 SP return_1 添加一个参数来解决这个问题,该参数将控制 return_1 是选择记录还是只是做一些事情并静默退出。

于 2009-03-03T11:28:54.240 回答