【问题标题】:MS SQL: Suppress return value of stored procedure called in stored procedureMS SQL:抑制存储过程中调用的存储过程的返回值
【发布时间】:2009-03-03 11:18:34
【问题描述】:

我认为我遇到了与 kcrumley 在问题“Problem calling stored procedure from another stored procedure via classic 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 中的第一个记录集不是一种选择。我需要一个“仅限数据库”的解决方案。

【问题讨论】:

  • 一些响应指出您可以从 SELECT 更改为 RETURN,但这是一个很好的问题 - 如果嵌套存储过程必须 SELECT 怎么办,因为其他东西调用它,并且你不能改变它吗?我想知道是否有可能“吞下”这样的结果集。

标签: sql-server stored-procedures nocount


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这不是 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'
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多