我们在客户站点的应用程序遇到了一个奇怪的错误。我们已设法将其缩小到仅使用 Management Studio 和 SQL Server 即可复制行为的程度。
我们有两台机器,A和B:
+------------+ +--------------------+ | [A] | | [B] | | 管理 | --------------> | SQL Server 2008 R2 | | 工作室 | | 企业 x64 | +------------+ +--------------------+
我们在机器 A 上的 Management Studio 中针对机器 B 上的 SQL Server 实例运行 SQL 脚本。我们实际上并没有执行脚本,只是解析它。
大多数情况下,解析操作都运行正常。偶尔(似乎是随机的),解析操作会因语法错误而失败。错误消息显示脚本中出现错误的部分,该部分显示为原始脚本中的一些 SQL,已被截断并附加了随机字符。
一个例子:
原始 SQL:
SELECT DISTINCT ST.TABLE_NAME as TableName
FROM INFORMATION_SCHEMA.TABLES AS ST
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS SC
ON SC.TABLE_NAME = ST.TABLE_NAME
WHERE ST.TABLE_TYPE = 'BASE TABLE'
AND SC.COLUMN_NAME = 'Identity'
AND ST.TABLE_NAME != 'dtproperties'
ORDER BY ST.TABLE_NAME
错误的 SQL(由 SQL Server 报告):
SELECT DISTINCT ST.TABLE_NAME as TableName
FROM INFORMATION_SCHEMA.TABLES AS ST
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS SC
ON SC.TABLE_NAME = Sā怊
上述示例显示了查询是如何被破坏的。这种情况并不总是发生,并且导致错误的 SQL 也并不总是相同。根据另一个 SQL Server 实例解析此脚本不会产生任何错误,表明该脚本没有问题。
它出现有东西破坏了服务器正在接收的 SQL。这让我认为问题要么出在客户端,要么出在从客户端到服务器的 SQL 传输中。我有一个发生错误期间的 SQL 跟踪,它显示 SQL Server 接收 SQL 时 SQL 已被破坏。
我们无法找到导致此行为的任何可能原因,因此无法找到修复方法。由于错误似乎是随机发生的,因此也很难生成重现步骤来提交错误报告。
有任何想法吗?
答案1
拔出 SQL Server。是时候进行彻底的系统检查了。内存(计算机的,但也可能网卡的)可能是罪魁祸首。我预计会看到内存错误出现。