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

Откуда: Москва
Сообщений: 175
declare

@a INT,
@b INT

set @a = null
set @b = null

if @a = @b begin
print 'OK'
end
else
begin
print 'Not OK'
end
Как добится 'OK' при спавнении двух переменных со значением NULL?
31 окт 03, 11:18    [401167]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с NULL  [new]
Анвар
Member

Откуда:
Сообщений: 58
if @a is null and @b is null
31 окт 03, 11:20    [401172]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с NULL  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
if (@a = @b) or (@a is NULL and @b isnull)

или

if isnull(@a, 0) = isnull(@b, 0)
31 окт 03, 11:21    [401175]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с NULL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
SET ANSI_NULLS OFF
31 окт 03, 11:22    [401181]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с NULL  [new]
Andrew_P
Member

Откуда: Москва
Сообщений: 175
pkarklin, спасибо.

Анвар и tpg, решение не подходит, т.к. @a и @b могут и меть отличные от NULL значения.
31 окт 03, 11:28    [401205]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с NULL  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Я не понял, а чем

if (@a = @b) or (@a is NULL and @b is NULL)

не подходит? Зато не надо установки сервера ворошить.
31 окт 03, 11:33    [401229]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с NULL  [new]
Andrew_P
Member

Откуда: Москва
Сообщений: 175
tbg, тебе отдельное большое спасибо.
Вот код:
  SET ANSI_NULLS OFF


DECLARE
updated_csr insensitive cursor for
select office, file_, client, service, exp_num, exp_date, exp_sum, exp_currency, exp_type, paid_num, paid_date, paid_sum, paid_currency, paid_type, paid_case_num, paid_manager
from inserted
for read only

open updated_csr
fetch updated_csr into @office, @file_, @client, @service, @exp_num, @exp_date, @exp_sum, @exp_currency, @exp_type, @paid_num, @paid_date, @paid_sum, @paid_currency, @paid_type, @paid_case_num, @paid_manager

while @@fetch_status >= 0
begin
if (
select count(*)
from pay_client
where
((office = @office) or (office is null and @office is null))
and ((file_ = @file_) or (file_ is null and @file_ is null))
and ((client = @client) or (client is null and @client is null))
and ((service = @service) or (service is null and @service is null))
and ((exp_num = @exp_num) or (exp_num is null and @exp_num is null))
and ((exp_date = @exp_date) or (exp_date is null and @exp_date is null))
and ((exp_sum = @exp_sum) or (exp_sum is null and @exp_sum is null))
and ((exp_currency = @exp_currency) or (exp_currency is null and @exp_currency is null))
and ((exp_type = @exp_type) or (exp_type is null and @exp_type is null))
and ((paid_num = @paid_num) or (paid_num is null and @paid_num is null))
and ((paid_date = @paid_date) or (paid_date is null and @paid_date is null))
and ((paid_sum = @paid_sum) or (paid_sum is null and @paid_sum is null))
and ((paid_currency = @paid_currency) or (paid_currency is null and @paid_currency is null))
and ((paid_type = @paid_type) or (paid_type is null and @paid_type is null))
and ((paid_case_num = @paid_case_num) or (paid_case_num is null and @paid_case_num is null))
and ((paid_manager = @paid_manager) or (paid_manager is null and @paid_manager is null))
) > 1
begin
rollback transaction
raiserror 99999 'Запись идеинтична одной из сущесвующих в олате!'
return
end

fetch updated_csr into @office, @file_, @client, @service, @exp_num, @exp_date, @exp_sum, @exp_currency, @exp_type, @paid_num, @paid_date, @paid_sum, @paid_currency, @paid_type, @paid_case_num, @paid_manager
end

deallocate updated_csr

SET ANSI_NULLS ON
в котором SET ANSI_NULLS OFF - не работает, а твоя идея работает :)
31 окт 03, 12:03    [401317]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с NULL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Я ни в коем случаи ничего не имею против решения от tpg, но таки хотелось бы знать, в чем именно выражается SET ANSI_NULLS OFF - не работает?
IMHO, вы не правильно юзаете SET ANSI_NULLS. Если вы привели кусок кода хп, то для хп значение SET ANSI_NULLS устанавливатеся равному значению на момент создания хп, SET ANSI_NULLS OFF в теле хп игнорируется сиквелом. Естественно, что вариант c IS NULL универсальнее и не зависит от установок.
31 окт 03, 12:31    [401387]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить