顧客サイトでアプリケーションに奇妙なエラーが発生しました。 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 を取り外します。徹底的なシステム チェックが必要です。メモリ (コンピューターのメモリだけでなく、ネットワーク カードのメモリも) が原因の可能性があります。メモリ エラーが表示されることが予想されます。