Извинения, если это не подходит, но на самом деле это «почему», а не «как». Не уверен, что это подходит, но не знаю лучшего места, чтобы спросить, и я не могу думать, как фраза Google, чтобы получить то, что я ищу.SQL-оценка предложений IF
IF 'hell' = 'freezing over'
BEGIN
SELECT log(0)
END
Посмотрите на это заявление. Нет мира, в котором предложение IF будет истинным. Если я попытаюсь запустить его, я ожидаю, что SQL перейдет через предложение IF и переместится в конец. Вместо этого я получаю:
An invalid floating point operation occurred.
Это странно. Поэтому я предполагаю, что это так, как это делает SQL. За исключением ...
IF 'hell' = 'freezing over'
BEGIN
SELECT 1/0
END
Здесь нет никаких ошибок. Заявление в предложении IF должно по-прежнему генерировать ошибку. Может ли кто-нибудь объяснить, почему этого не происходит?
Это вызвало отладку массивного набора SQL-вычислений, в котором EXP (SUM (LOG())) используется для накопления данных в условии if. Я могу изменить код, чтобы остановить это снова, но почему он оценивает что-то в условии IF, которое не выполняется.
Cheers.
EDIT: дополнительное развлечение. Попробуй поймать? Pffft
IF 1=2
BEGIN
BEGIN TRY
SELECT SQRT(-1)
END TRY
BEGIN CATCH
END CATCH
END
Non математическая:
IF 1=2
BEGIN
SELECT SUBSTRING('hello',-1,-1)
END
Предупреждения ANSI не имеют никакого значения, но это ссылка, я думаю, мне так было нужно спасибо :) –
Ваш прием. По ANSI_WARNINGS я имел в виду, что если в любое время выдается «set ansi_warnings off», вы не увидите деления на нулевую ошибку. Поскольку компилятор не может заранее знать состояние флага ANSI_WARNINGS при выполнении скомпилированного запроса, он должен игнорировать любое сложенное выражение, которое увеличивает время деления на нулевое исключение во время компиляции, поскольку оно не может предсказать желаемое поведение. (Если бы ansi_warnings гарантировалось, что всегда будет 1/0, то сбрасывается до NULL) –