Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Кабысдох 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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Отключить неяное преобразование типов ? |
||
19 июн 15, 13:34 [17792418] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
select isnull(CAST(nullif(0, 0) AS INT), -1) |
19 июн 15, 13:35 [17792423] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
похоже, магической настройки нет. та же ошибка выдается и в 2008 даже в базе с compatibility_level = 80. |
19 июн 15, 13:35 [17792425] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
А что вот это даст на 2000?select isnull(CAST(NULL AS INT), -1) |
19 июн 15, 13:36 [17792432] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
вы типа код не переписали? просят же одной настройкой заставить ранее написанное на 2012-ом заработать |
||
19 июн 15, 13:37 [17792444] Ответить | Цитировать Сообщить модератору |
Кабысдох Member Откуда: Сообщений: 87 |
select isnull(CAST(NULL AS INT), -1) - отрабатывает. вопрос в настройке сервера, не хочется лопатить и менять over 1200 процедур... |
19 июн 15, 13:39 [17792454] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Неявное преобразование - это не настройка сервера. Это сам сервер. |
||
19 июн 15, 13:40 [17792466] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
а что вернуть-то должно, ровно то же и возвращает, -1 |
||
19 июн 15, 13:42 [17792484] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Видимо новый сиквел экономит байты. |
19 июн 15, 13:51 [17792574] Ответить | Цитировать Сообщить модератору |
Кабысдох 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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Если не контролировать типы данных самому, то так и будет |
||
19 июн 15, 14:17 [17792808] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |