В нашем приложении на сайте клиента произошла странная ошибка. Нам удалось сузить его до точки, где мы можем воспроизвести поведение, используя только Management Studio и SQL Server.
У нас есть две машины, A и B:
+------------+ +--------------------+ | [A] | | [B] | | Management | --------------> | SQL Server 2008 R2 | | Studio | | Enterprise x64 | +------------+ +--------------------+
Мы запускаем сценарий SQL в Management Studio на машине A против экземпляра SQL Server на машине B. На самом деле мы не выполняем сценарий, а просто анализируем его.
В большинстве случаев операция синтаксического анализа работает нормально. Иногда (по-видимому, случайно) операция синтаксического анализа завершается с ошибкой синтаксиса. В сообщении об ошибке отображается часть сценария с ошибкой, которая выглядит как некоторый 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 был поврежден, когда SQL Server его получает.
Нам не удалось отследить любую возможную причину такого поведения, поэтому мы не можем найти решение. Поскольку ошибки возникают случайно, также очень сложно сгенерировать шаги воспроизведения для отправки отчета об ошибке.
Любые идеи?
Вытащите SQL Server. Время для тщательной проверки системы. Память (компьютера, но, возможно, и сетевой карты) может быть виновником. Я ожидал увидеть появление ошибок памяти.