SQL Сервер не обеспечивает очень хорошую обработку ошибок в операторе SELECT
. Единственное исключение касается преобразования типов и функций try_
, но даже это относительно недавно в истории базы данных.
SQL не одинок в этом. Стандарт просто не затрагивает этот вопрос.
Единственное, что вы можете сделать, это использовать выражение case
, если вы понимаете условия, при которых вы получите ошибку:
select (case when numbercol >= 0 then sqrt(numbercol) end)
from tablesq;
SQL Сервер гарантирует, что условия when
оцениваются по порядку, останавливаясь при первом совпадении, а then
оценивается после when
. Я должен сказать «почти при любых обстоятельствах»; В агрегационных запросах сделаны некоторые оптимизации, которые несколько ослабляют это утверждение.
Многие другие базы данных имеют аналогичные ограничения. И в большинстве из них вы можете использовать пользовательскую функцию, которая перехватывает исключение. Увы, SQL Сервер не допускает блоки try
/ catch
в UDF, поэтому это не вариант.