And*_*y M 2 sql-server sqlcmd session
我的脚本包含多个GO关键字。我知道 SQLCMD 解释GO为批处理分隔符,因此代码不是作为单个块运行的,而是分隔符(批处理)之间的每个部分单独运行。我的问题是,所有批次都在同一个会话中执行吗?
我尝试使用一个简单的脚本来测试这个:
SELECT @@SPID
GO
SELECT @@SPID
GO
SELECT @@SPID
GO
Run Code Online (Sandbox Code Playgroud)
然后我使用此命令从命令行运行脚本
SELECT @@SPID
GO
SELECT @@SPID
GO
SELECT @@SPID
GO
Run Code Online (Sandbox Code Playgroud)
并得到这个输出:
SQLCMD -S MyServer\Instance -E -i MyScript.sql
Run Code Online (Sandbox Code Playgroud)
它似乎肯定地回答了我的问题,但后来我再次运行脚本并得到完全相同的输出,即所有值都是一样的62。显然,SQLCMD 的两个单独执行不可能在同一个会话中运行,它们只是碰巧收到了相同的会话 ID。但这反过来又让我认为@@SPID单次运行返回的相同值也不一定意味着它是同一个会话。每个批处理都可以在恰好收到相同 ID 的不同会话中执行,类似于 SQLCMD 的不同执行在具有相同 ID 的不同会话中运行的方式。
因此,我的问题仍然存在:是否在同一会话中在 SQLCMD 中执行了多个批次的相同脚本?有没有办法确定这一点?
您应该能够SQLCMD通过#temp在SQLCMD脚本顶部创建本地表并尝试在后续批次中引用该临时表来验证单个脚本中的所有批次是否在同一会话中运行。由于本地临时表的范围在会话结束时结束,如果后续批次确实在不同的会话中运行(即使 id 相同),您也会收到table not found错误。
create table #test(TestColumn varchar(50))
insert into #test(TestColumn) values('I''m still here!')
GO
SELECT @@SPID
SELECT * FROM #test
GO
SELECT @@SPID
SELECT * FROM #test
GO
SELECT @@SPID
SELECT * FROM #test
GO
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |