为什么注释中带有“ xp_cmdshell ”的脚本因传输级别错误而失败?

Ed *_*ves 7 sql-server sql-server-2014 xp-cmdshell

执行作为大型脚本一部分的以下批处理时:

...
GO
-----------------------------------------------------------------------------------------------
-- Removed the xp_cmdshell for deleting the backup file 
-----------------------------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PR_MyProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PR_MyProc]
GO
...
Run Code Online (Sandbox Code Playgroud)

我们在远程 SQL Server 上收到以下错误:

Msg 121, Level 20, State 0, Line 0 从服务器接收结果时发生传输级错误。(提供者:TCP 提供者,错误:0 - 信号量超时期限已过期。)

当我们从注释中删除“xp_cmdshell”时,批处理成功。此错误仅发生在我们的某些 SQL 服务器上。我们正在远程运行脚本。失败的 SQL Server 版本是:

Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Microsoft Corporation 标准版(64 位)在 Windows NT 6.2 (X64) (Build 9200: ) (Hypervisor)

在另一台服务器上,相同的脚本成功。该服务器具有以下版本:

Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Windows NT 6.1 (X64)上的 Microsoft Corporation 标准版(64 位)(内部版本 7601:Service Pack 1)(管理程序)

两台服务器都启用了 xp_cmdshell。失败的服务器正在运行 Windows 2012 R2,而成功的服务器正在运行 Windows Server 2008 R2 SP1。如果我们在本地服务器上运行脚本,它会成功。如果我们从另一个虚拟服务器远程运行脚本,它就会失败。我们还发现脚本只有在注释有“(空格)xp_cmdshell(空格)”时才会失败。

谁能告诉我为什么这个脚本失败?为什么它在某些服务器上失败而不是在其他服务器上?

服务器上没有运行防病毒软件。SQL Server Management Studio 已连接,将注释更改为删除xp_cmdshell始终成功,原始脚本始终失败。

Tom*_*m V 6

有一个连接项目正在讨论(很好地讨论......)这个问题,所以它似乎是一个错误。

文本“xp_cmdshell”导致传输级错误:来自远程系统的信号量超时期限已过期

看来该字符串会导致问题,不仅在注释中,而且在任何用作确切字符串的地方,因此即使

SELECT 'xp_cmdshell'
Run Code Online (Sandbox Code Playgroud)

根据错误报告导致相同的错误。

所以看起来确切的字符串xp_cmdshell确实是问题所在,不幸的是连接项被关闭为“不可重现”。
话虽如此,我也无法在我的 SQL 2014 (12.0.2000.8, Windows NT 6.3 (Build 9600:)) 测试系统上重现它(在本地连接上),所以操作系统可能是相关的。如连接项中所述,从本地管理工作室与通过网络执行查询也可能相关。

因此,您可以通过更改确切文本(如您所做的那样)来解决它,或者尝试重新打开连接项或通过 Microsoft 支持提交错误报告。


Ed *_*ves 1

我们的解决方法是从评论中删除 xp_cmdshell。我已将其替换为“xp(space)cmdshell”。