为什么 SET ROWCOUNT 不会在 GO 后重置?

Mik*_*eel 6 sql-server t-sql

根据该文件SCOPE_IDENTITY

作用域是一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句在同一个存储过程、函数或批处理中,则它们在同一范围内。

根据SQL Server Utilities Statements - GO

GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令。SQL Server 实用程序将 GO 解释为它们应该将当前一批 Transact-SQL 语句发送到 SQL Server 实例的信号。

当前批次的语句由自上次 GO 以来输入的所有语句组成,或者如果这是第一次 GO,则自特别会话或脚本开始以来输入的所有语句。

有了这些信息,我(在 SMSS 中)写了这个 T-SQL:

SET ROWCOUNT 1    -- Limit to 1 row returned

-- Returns 1 row as expected
SELECT *
FROM MyTable

GO -- Batch ends

-- Still returns one row
SELECT *
FROM MyTable
Run Code Online (Sandbox Code Playgroud)

根据我的理解SET ROWCOUNT(我知道它在 DML 中已被弃用,但在 SELECT 中不推荐使用)范围仅限于它的模块(从我所看到的,无论如何检查其他帖子)。

我的问题:

  1. SET ROWCOUNT上述“模块”规则的例外吗?

  2. 它根本不限于模块吗?

  3. 是否有更完整的 T-SQL 范围定义?

我运行了一个查询,然后是一个存储过程,它只将 rowcount 设置为 4(我突然选择了 4 个),然后再次运行查询:

SELECT * FROM MyTable 
EXE MySproc 
SELECT * FROM MyTable 
Run Code Online (Sandbox Code Playgroud)

...返回所有行,然后返回 4 行,然后再次返回所有行,因此它的范围肯定至少是 sprocs。

mar*_*uso 10

大多数(全部?)set语句在会话级别生效......

提供了几个改变当前会话处理的 SET 语句

...带有正常的警告。

有关更多详细信息,请参阅SET 语句 (Transact-SQL)


set@该链接列出的相当多的语句显然是会话级设置,例如:

  • set dateformat
  • set fips_flagger
  • set indentity_insert
  • set statistics time/io
  • set nocount
  • set transaction isolation level

通过会话级别,我的意思是它们跨批次/go语句保持不变。