sql-server - 为什么 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 命令。这是什么原因,可以预防吗?
解决方案
从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'
推荐阅读
- c++ - 减号和加号对c ++中的字符串有什么作用
- python-3.x - 我在 pyhton 3.8 中安装 scipy 时出错
- python - 对这个“实验室”感到困惑
- python - 在 altair 中下载选定的数据
- angular - Highcharts 自定义符号
- google-apps-script - 将基于特定列值的范围复制到新工作簿中的多个选项卡中
- javascript - Vue Leaflet 地图图块顺序错误
- mysql - 在特定问题上使用连接来选择产品的 SQL 查询
- upload - Onedrive Upload API 上传损坏的文件或图像
- database - 使用数据创建表的副本而不记录