Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Странное поведение NULLIF()  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3205
Добрый локалтайм. Кто-нибудь может объяснить, почему из вот этого:
select nullif(null, '') as [1]
GO
select nullif(cast(null as varchar), '') as [2]
GO
получается вот такое:
Server: Msg 8133, Level 16, State 1, Line 5
None of the result expressions in a CASE specification can be NULL.
2
------------------------------
NULL
От установок ANSI_NULLS и CONCAT_NULL_YIELDS_NULL результат не зависит. Версия сервера (от нее, впрочем, тоже не зависит):
Microsoft SQL Server 2000 - 8.00.944 (Intel X86)
May 19 2004 18:32:44
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
Не хочу показывать пальцем, но имхо подозрительно похоже на баг.
5 апр 05, 15:16    [1442177]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение NULLIF()  [new]
ChA
Member

Откуда: Москва
Сообщений: 10989
В данном случае у Вас отлавливается еще при компиляции, если вместо NULL будет переменная, то все пройдет...
5 апр 05, 15:29    [1442250]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение NULLIF()  [new]
Andriy Gushulay
Member

Откуда: Киев
Сообщений: 33
Как говорят, это не баг, это фича. Сиквел для сравнения двух величин должен знать их тип. В первом случае null "нетипизированый".
5 апр 05, 15:33    [1442279]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение NULLIF()  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3205
Да, с переменной все прокатывает. Спасибо.
5 апр 05, 16:15    [1442499]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Странное поведение NULLIF()  [new]
step_ks
Member

Откуда:
Сообщений: 936
Топик старый, но он единственный, который находится по приведенному сообщению об ошибке, поэтому счел разумным разместить небольшое продолжение здесь, а не в новом.

С переменной тоже не всегда прокатывает, в случае использования в nullif параметра инлайновой функции:

create function dbo.test_nullif(@i int)
returns table as return
(
  select 1 as a from (select 1 as a) a where nullif(@i,0) = nullif(@i,0) 
)
GO

/* работает */
declare @i int
set @i=null
select * from dbo.test_nullif(@i)
GO

/* не работает */
select * from dbo.test_nullif(null)
GO

То есть, оформив вроде бы корректно функцию, при её вызове с константой null в качестве параметра, получаем вылет. Понятно, что оптимизатор раскрыл запрос и подставил сам контстанту вместо параметра, но как-то не совсем честно получается.

Воспроизводится на SQL 2000
Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
	May  3 2005 23:18:38 
	Copyright (c) 1988-2003 Microsoft Corporation
	Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

На SQL 2005 проблем с null в nullif нет.
21 окт 09, 14:56    [7818213]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить