SQL Server に渡されるクエリが破損しています

SQL Server に渡されるクエリが破損しています

顧客サイトでアプリケーションに奇妙なエラーが発生しました。 Management Studio と SQL Server のみを使用して動作を再現できるところまで、原因を絞り込むことができました。

マシン A と B の 2 台があります。

+------------+ +--------------------+
| [あ] | | [あ] |
| 管理 | --------------> | 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 を取り外します。徹底的なシステム チェックが必要です。メモリ (コンピューターのメモリだけでなく、ネットワーク カードのメモリも) が原因の可能性があります。メモリ エラーが表示されることが予想されます。

関連情報