首页 > 解决方案 > 为什么 SQLCMD 模式在连接到其他服务器时似乎执行 xp_cmdshell 乱序?

问题描述

如果我连接到服务器“ServerA.domain.com”并在 SQL Management Studio 的 SQLCMD 模式下执行以下命令:

EXEC xp_cmdshell 'hostname'
:CONNECT ServerB.domain.com
EXEC xp_cmdshell 'hostname'

然后输出是:

Connecting to ServerB.domain.com...
output
---------------------------------------
ServerB
NULL

(2 rows affected)

output
------------------------------------------
ServerB
NULL

(2 rows affected)

Disconnecting connection from ServerB.domain.com...

尽管脚本的顺序,它似乎在第一个 xp_cmdshell 命令之前执行 :CONNECT 命令。这是什么原因,可以预防吗?

标签: sql-serversqlcmdxp-cmdshell

解决方案


sqlcmd命令文档中并不明显,但它确实提供了提示:

命令立即执行。它们不像 Transact-SQL 语句那样放入执行缓冲区。

这里的含义是使用以下 .sql 文件:

EXEC xp_cmdshell 'hostname'
:CONNECT ServerB.domain.com
EXEC xp_cmdshell 'hostname'

首先:CONNECT ServerB.domain.com执行,然后是两个缓冲语句EXEC xp_cmdshell 'hostname',这与您看到的行为相关。

要获得预期的行为,您需要添加一个GO批处理分隔符:

EXEC xp_cmdshell 'hostname'
GO
:CONNECT ServerB.domain.com
EXEC xp_cmdshell 'hostname'

推荐阅读