Есть сценарии, где это может произойти.Обычно этот тип ошибки преобразования содержится в выражении 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 произвольно выбирает один из них.