Ошибка преобразования при использовании SELECT TOP, но не при выборе всех строк - PullRequest
0 голосов
/ 29 мая 2018

SSMS - SQL 2017 Я выбираю записи в представлении - 3 сценария и запрос не выполняется в одном с ошибкой.

SELECT top 94 *
FROM [myDB].[dbo].[test1]

Результат: (затронуто 94 строки)

SELECT top 95 *
FROM [myDB].[dbo].[test1]

Результат:

Сообщение 241, Уровень 16, Состояние 1, Строка 2 Преобразование не удалось при преобразовании даты и / или времени из строки символов.

SELECT *
FROM [myDB].[dbo].[test1]

Результат: (24934затронутые строки)

Это озадачивает меня.Почему SELECT дает ошибку во 2-м сценарии, а не в 3-м.

1 Ответ

0 голосов
/ 29 мая 2018

Есть сценарии, где это может произойти.Обычно этот тип ошибки преобразования содержится в выражении select или where, которое имеет несовместимость типов.

Ваши результаты говорят о том, что:

  • плохие строки в данных.
  • Они отфильтровываются представлением.
  • Представление может изменять планы запросов, поэтому иногда ошибочные строки иногда оцениваются, а иногда нет.

Мое лучшее предположение, что вы видите изменение в плане запроса.Когда вы выбираете 95 строк, план запроса обрабатывает данные и находит ошибку.Строка с ошибкой будет отфильтрована позже, но ошибка уже произошла.

Когда вы выбираете все строки, план запроса изменяется и ошибка больше не возникает, поскольку фильтрация выполняется до ошибки преобразования..

Например, рассмотрим этот запрос:

select . . .
from t1 join
     t2
     on t1.x = t2.x
where t1.col1 = 5 and
      cast(t2.col2 as date) = cast(getdate() as date);  -- this generates the error

Это можно оценить двумя способами.При t1 в качестве таблицы управления фильтр на «5» выполняется для всех строк.Но только соответствующие строки в t2 фильтруются.Таким образом, ошибки не возникает.

В качестве альтернативы, t2 может быть отфильтровано, и фильтр применяется ко всем строкам.Ошибка!Мы никогда не узнаем, что строки ошибок были бы отфильтрованы.

Выбор планов выполнения мог бы основываться на количестве возвращаемых строк.Или затраты могут быть одинаковыми, и SQL Server произвольно выбирает один из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...