SQL Server: оператор WHERE. Укороченная операция. Продолжение
С позиций логической обработки запросов такой программный код не должен оказаться неудачным. Но из соображений обеспечения достаточной производительности средство синтаксического анализа SQL Server устраняет вложенность или встраивает код внутреннего запроса во внешний запрос. Это приводит к программному коду, эквивалентному первоначальному запросу без табличного выражения.
Следовательно, выполнение кода приводит к той же ошибке. Одно из решений этой проблемы — использовать функцию TRY_CAST вместо функции CAST для обработки преобразования. Первый пытается выполнить преобразование и в случае успеха возвращает преобразованное значение; но в случае неудачи вместо ошибки возвращается значение NULL.
Таким образом, даже если SQL Server оценивает преобразование перед другим предикатом, выполнение кода не завершится ошибкой. Похожая функция TRY_CONVERT дана как альтернатива функции CONVERT. В листинге ниже приводится программный код для этого решения. На сегодня SQL Server поддерживает функции TRY_% только для целей преобразования.
Было бы хорошо иметь похожую функцию, такую как TRY EXPRESSION (https://connect.microsoft.com/SQLServer/feedback/details/778583), для любого типа скалярных выражений, так как аналогичные проблемы могут возникать вследствие других ошибок (деление на ноль, переполнение, ввод извне домена и т. д.).
Пример использования TRY_CAST
Другое решение — использовать выражение CASE с предшествующим преобразованием, только если тип данных целочисленный, как в листинге ниже. Это даже в какой-то степени более правильное решение - столь же простое и надежное, как крепление натяжного потолка (http://gipsohouse.ru/ceilings/dropped/972-kreplenie-natyazhnogo-potolka-k-stene-iz-gipsokartona.html).
Использование выражения CASE с преобразованием
В документации но выражению CASE (https://msdn.microsoft.com/en-us/library/ms181765.aspx) для SQL Server говорится: «Вам следует полагаться только на порядок вычислений условий WHEN для скалярных выражений (включая некоррелированные вложенные запросы, которые возвращают скалярные величины), но не для статистических выражений».
В данном случае мы не используем статистические выражения, поэтому можно полагаться на порядок вычислений и закорачивание.