К сожалению, оптимизатор запросов SQL Server может и переставить элементы из вашего запроса таким образом, что может привести к ошибкам, которые будут введены, которые не были там в исходном запросе. Это в значительной степени зависит от точного плана запросов, который используется, что, в свою очередь, зависит не только от определения таблицы и текста запроса, но и от того, как распределяются ваши значения.
В вашем случае, возможно, что SQL Server будет проверять observ_value >= 190
, неявно преобразования observ_value
в int
, перед проверкой, что observ_value NOT LIKE '%[^0-9]%'
. Является ли это допустимым повторным заказом вашего запроса, является спорным, но даже если это недействительно, это то, что делает SQL Server и что-то, с чем вам приходится работать.
Перепишите запрос, чтобы убедиться, что никакое преобразование не-числовых значений int
никогда не может быть выполнено:
SELECT
TEMP.observ_value AS value
FROM
(SELECT CASE
WHEN observ_value NOT LIKE '%[^0-9]%'
THEN CONVERT(INT, observ_value) END
AS observ_value
FROM LAB_RESULTS
WHERE observ_value NOT LIKE '%[^0-9]%') TEMP
WHERE
observ_value >= 190
просто FYI, я попробовал один и тот же запрос в MSSQL 2012, это работает. – Guoliang
Показать некоторые данные образца – Mihai