Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 coalesce в MS SQL Server 7.0 и 2008  [new]
misererror
Member

Откуда:
Сообщений: 3
Hi, All :)

Столкнулся со странным поведением триггера после переноса старой бд с 7.0 на 2008 R2 Express. В одних и тех же условиях выражение, которое под 7.0 возвращало 0 (ноль), теперь возвращает NULL. В одном из триггеров содержится примерно следующее:

set @nOperationID = ( select coalesce ( [ROW_X], 0 ) from [TABLE_Y] where [ROW_A] = @nProcID and [ROW_B] = @nJSTBU )

Как оно вообще может выдавать NULL в @nOperationID, если одним из аргументов coalesce прописана константа?!
2 ноя 12, 07:51    [13412015]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
misererror
Member

Откуда:
Сообщений: 3
На всякий случай уточню: вариант с 7.0 до сих пор работоспособен, всё можно посмотреть и сравнить. В одинаковой ситуации на 7.0 триггер корректно отрабатывает, на 2008 выдаётся ошибка о попытке записать NULL в поле, которое его не допускает (а пишется туда именно @OperationID)
2 ноя 12, 07:57    [13412024]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
misererror
Hi, All :)

Столкнулся со странным поведением триггера после переноса старой бд с 7.0 на 2008 R2 Express. В одних и тех же условиях выражение, которое под 7.0 возвращало 0 (ноль), теперь возвращает NULL. В одном из триггеров содержится примерно следующее:

set @nOperationID = ( select coalesce ( [ROW_X], 0 ) from [TABLE_Y] where [ROW_A] = @nProcID and [ROW_B] = @nJSTBU )

Как оно вообще может выдавать NULL в @nOperationID, если одним из аргументов coalesce прописана константа?!
Например, если запрос
select coalesce ( [ROW_X], 0 ) from [TABLE_Y] where [ROW_A] = @nProcID and [ROW_B] = @nJSTBU

возвращает ноль строк.
Т.е. значение @nOperationID остается неизменным, скорее всего NULL.
2 ноя 12, 08:18    [13412055]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
Добрый Э - Эх
Guest
misererror
Как оно вообще может выдавать NULL в @nOperationID, если одним из аргументов coalesce прописана константа?!


Не нужно путать "пустое значение в результате выборки" и "пустую выборку".
Твой запрос ничего не возвращает. До COALESCE дело просто не доходит.
2 ноя 12, 08:19    [13412058]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
Добрый Э - Эх
Guest
misererror,

вот тебе пища для размышления:
with t as (select 1 num)
select coalesce(num, 1) from t where 1 = 0
2 ноя 12, 08:21    [13412068]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
Добрый Э - Эх
Guest
misererror
На всякий случай уточню: вариант с 7.0 до сих пор работоспособен, всё можно посмотреть и сравнить.
Состав данных по таблицам TABLE_Y в обоих базах идентичен?
2 ноя 12, 08:35    [13412107]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
Добрый Э - Эх
Guest
Как вариант "восстановления работоспособности" - добавить в запрос агрегат:

with t as (select 1 num)
select coalesce(max(num), -10) from t where 1 = 0
2 ноя 12, 08:38    [13412114]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
FantomGood
Member

Откуда: Херсон
Сообщений: 335
если не подходит isnull() то еще вариант
set @nOperationID = 0 
select @nOperationID = coalesce ( [ROW_X], 0 ) from [TABLE_Y] where [ROW_A] = @nProcID and [ROW_B] = @nJSTBU 
2 ноя 12, 12:05    [13413368]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Добрый Э - Эх
Как вариант "восстановления работоспособности" - добавить в запрос агрегат:

with t as (select 1 num)
select coalesce(max(num), -10) from t where 1 = 0

Не понятно почему работает? Ведь where 1 = 0, значит записей не должно быть никогда! Где логика?
2 ноя 12, 12:10    [13413429]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
trew
Добрый Э - Эх
Как вариант "восстановления работоспособности" - добавить в запрос агрегат:

with t as (select 1 num)
select coalesce(max(num), -10) from t where 1 = 0

Не понятно почему работает? Ведь where 1 = 0, значит записей не должно быть никогда! Где логика?


потому что
http://msdn.microsoft.com/ru-ru/library/ms173454.aspx
Агрегатные функции выполняют вычисление на наборе значений и возвращают одиночное значение.
2 ноя 12, 12:16    [13413471]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
misererror
Member

Откуда:
Сообщений: 3
Господа, всем огромное спасиБо за объяснения и наведения на мысли! Пока у меня остался вопрос - почему это работает в 7.0 (а оно работает!) Потому что рам реально пустая выборка. Но в одном случае возвращается 0 из coalesce, а в другом случае (в 2008) - NULL. Сейчас пойму, что правильно, и напишу в форме, которая в любом случае даст мне непустое значение...
2 ноя 12, 12:35    [13413574]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
Добрый Э - Эх
Guest
Minamoto,

чую, сейчас кто-то спросит, почему тогда вот такой запрос ничего не возвращает:

with t as (select 1 num)
select coalesce(max(num), -10) from t where 1 = 0
group by num
2 ноя 12, 12:52    [13413679]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Добрый Э - Эх
Minamoto,

чую, сейчас кто-то спросит, почему тогда вот такой запрос ничего не возвращает:

with t as (select 1 num)
select coalesce(max(num), -10) from t where 1 = 0
group by num
Цитатой не отвечу, но по логике - если мы не прописываем поле, по которому группируем, то агрегатная функция выводит агрегатное значение для всего набора значений (даже если набор пустой) - агрегат для пустого набора - NULL.
Если прописываем поле, по которому группируем, то агрегатная функция выводит сначала выбирает все уникальные значения поля группировки, и потом для каждого значения считает агрегатное значение.
Запрос не возвращает ничего, потому что сам набор уникальных значений поля группировки - пустой, т.е. в нем нет ни одной строки. До формирования агрегатного значения дело даже не доходит.
2 ноя 12, 13:18    [13413894]     Ответить | Цитировать Сообщить модератору
 Re: coalesce в MS SQL Server 7.0 и 2008  [new]
aWlad
Member

Откуда: Москва
Сообщений: 42
Minamoto
Добрый Э - Эх
Minamoto,

чую, сейчас кто-то спросит, почему тогда вот такой запрос ничего не возвращает:

with t as (select 1 num)
select coalesce(max(num), -10) from t where 1 = 0
group by num
Цитатой не отвечу...


declare @q int;
with t as (select 1 num)
select @q = coalesce(num, 1) from t where 1 = 0;
select ISNULL(@q,0);

ТС хотел "всегда ноль".
2 ноя 12, 16:35    [13415640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить