我的脚本包含多个GO
关键字。我知道 SQLCMD 解释GO
为批处理分隔符,因此代码不是作为单个块运行,而是分隔符(批处理)之间的每个部分单独运行。我的问题是,所有批次都在同一个会话中执行吗?
我尝试使用这样的简单脚本对此进行测试:
SELECT @@SPID
GO
SELECT @@SPID
GO
SELECT @@SPID
GO
然后我使用这个命令从命令行运行脚本
SQLCMD -S MyServer\Instance -E -i MyScript.sql
并得到这个输出:
------
62
(1 rows affected)
------
62
(1 rows affected)
------
62
(1 rows affected)
它似乎肯定地回答了我的问题,但随后我再次运行脚本并得到完全相同的输出,即所有值都62
再次出现。显然 SQLCMD 的两个单独执行不可能在同一个会话中运行,它们只是碰巧收到了相同的会话 ID。但这反过来又让我认为@@SPID
单次运行返回相同的值可能并不一定意味着它是同一个会话。每个批次都可以在恰好接收到相同 ID 的不同会话中执行,类似于 SQLCMD 的不同执行在具有相同 ID 的不同会话中运行的方式。
因此,我的问题仍然存在:是否在同一会话中在 SQLCMD 中执行了多批相同的脚本?有没有办法确定这一点?
您应该能够通过在脚本顶部创建一个本地表并尝试在后续批次中引用该临时表来验证单个
SQLCMD
脚本中的所有批次是否在同一会话中运行。由于本地临时表的范围在会话结束时结束,如果后续批次确实在不同的会话中运行(即使 id 相同),您会收到错误。#temp
SQLCMD
table not found