SQL中"Set rowcount"的作用范围是什么?

5

我在我的存储过程中使用了"Set RowCount"。我有一个问题,Set RowCount的作用范围是什么?请考虑以下存储过程:

 CREATE PROC Test
    AS 
        BEGIN

            SET ROWCOUNT 10
            ...........

            SET ROWCOUNT 0

        END


CREATE PROC Test2
AS 
    BEGIN


        ...........

        SET ROWCOUNT 0

    END


CREATE PROC Test3
AS 
    BEGIN

        SET ROWCOUNT 10
        ...........


    END


CREATE PROC Test4
AS 
    BEGIN

        SET ROWCOUNT 10
        SET ROWCOUNT 5
        ...........
        SET ROWCOUNT 0      

    END

现在在上述存储过程中,您可能会看到我有不匹配的SetRowcount语句。那么我的问题是,如果我忘记将“Set RowCount 0”添加到我的开头“Set RowCount N”语句中,会怎样?这是必要的吗?它会影响应用程序中其余存储过程的执行吗?


你看过 https://dev59.com/d3RB5IYBdhLWcg3w6bYE 吗? - Beth
似乎影响子批次,但在快速测试退出后会被重置。 - Martin Smith
@Martin,你能给我解释一下“但在快速测试结束后会被重置”是什么意思吗? - Rocky Singh
1
在“从一个快速测试”部分之前可能应该加上逗号,以显示它与“似乎”相关,而不是与“退出时”相关,但是Martin省略了一个击键或错过了关键,或者没有添加必要的标点符号。 :)所以我认为句子的实际意义是:“从一个快速测试来看,SET ROWCOUNT语句似乎会影响子批处理,但在*[存储过程]*退出后会被重置。” - Andriy M
@Andriy - 哎呀,那个句子的标点符号有点不足啊!谢谢。 - Martin Smith
1个回答

5

与评论中链接的问题的已接受答案相反,据我所见,这方面的范围规则与#temp表可见性的规则完全相同。它会传播到子批处理,但当批处理退出时,它将重置为先前的值。

CREATE PROC #bar
AS
SELECT * FROM sys.objects
EXEC ('SELECT * FROM sys.objects')
GO

CREATE PROC #foo
AS
SET ROWCOUNT 1

EXEC #bar
GO

SET ROWCOUNT 4
EXEC #foo /*Returns 2 resultsets with 1 row*/
EXEC #bar /*Returns 2 resultsets with 4 rows*/

DROP PROC #foo
DROP PROC #bar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接