Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 NullIf - Arithmetic overflow error  [new]
Кабысдох
Member

Откуда:
Сообщений: 87
Доброго времени суток.

Два ms sql сервера. Один - 2000, второй -2012. Делаем миграцию базы данных из 2000 на 2012.

В хранимых процедурах в процессе генерации sql-строки может возникнуть вот такая часть:

select isnull(nullif(0, 0), -1)

Если ее запустить на 2000, результат равен -1. Все корректно.

Если ее запускать на 2012, то выдается ошибка "Arithmetic overflow error for data type tinyint, value = -1."

На 2012 работает конструкция вида: select isnull(convert(int, nullif(0, 0)), -1)

Как понимаю, отработывает оптимизатор sql, тип данных "понижает" до нижнего возможного.

Вопрос: Есть ли возможность это отключить, либо может быть какая-либо настройка 2012 сервера, чтоб конструкция select isnull(nullif(0, 0), -1) не выдавала ошибки? Или все же придется переписывать кучу хранимок?

Заранее спасибо!
19 июн 15, 13:29    [17792379]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кабысдох
Есть ли возможность это отключить,

Отключить неяное преобразование типов ?
19 июн 15, 13:34    [17792418]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
select isnull(CAST(nullif(0, 0) AS INT), -1)
19 июн 15, 13:35    [17792423]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
o-o
Guest
похоже, магической настройки нет.
та же ошибка выдается и в 2008 даже в базе с compatibility_level = 80.
19 июн 15, 13:35    [17792425]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
А что вот это даст на 2000?

select isnull(CAST(NULL AS INT), -1)
19 июн 15, 13:36    [17792432]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
o-o
Guest
a_voronin
select isnull(CAST(nullif(0, 0) AS INT), -1)

вы типа код не переписали?
просят же одной настройкой заставить ранее написанное на 2012-ом заработать
19 июн 15, 13:37    [17792444]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
Кабысдох
Member

Откуда:
Сообщений: 87
select isnull(CAST(NULL AS INT), -1) - отрабатывает.

вопрос в настройке сервера, не хочется лопатить и менять over 1200 процедур...
19 июн 15, 13:39    [17792454]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кабысдох
вопрос в настройке сервера

Неявное преобразование - это не настройка сервера. Это сам сервер.
19 июн 15, 13:40    [17792466]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
o-o
Guest
a_voronin
А что вот это даст на 2000?
select isnull(CAST(NULL AS INT), -1)

а что вернуть-то должно, ровно то же и возвращает, -1
19 июн 15, 13:42    [17792484]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9160
Видимо новый сиквел экономит байты.
19 июн 15, 13:51    [17792574]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
Кабысдох
Member

Откуда:
Сообщений: 87
Мда, вот не ожидал отсюда подвоха...
Генерировал примерно так:

declare @id int
set @id = 0
declare @strsql nvarchar(200)
set @strsql = 'select isnull(nullif(' + convert(nvarchar(2), @id) + ', 0), -1)'
exec sp_executesql @strsql


Видать, придется все же cast везде всовывать.

Спасибо всем!
19 июн 15, 14:06    [17792695]     Ответить | Цитировать Сообщить модератору
 Re: NullIf - Arithmetic overflow error  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кабысдох
Мда, вот не ожидал отсюда подвоха...

Если не контролировать типы данных самому, то так и будет
19 июн 15, 14:17    [17792808]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить