Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование ANSI_NULLS / 4 сообщений из 4, страница 1 из 1
02.12.2002, 21:02:05
    #32074865
Александр Азаркович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ANSI_NULLS
Вопрос о стиле.

Регулярно пишу в хранимых процедурах, например,
Код: plaintext
if @input_parameter = NULL

Разумеется, SET ANSI_NULLS OFF перед созданием каждой процедуры.
Получил замечание от коллег за дурной стиль (кто-то из них каким-то образом процедуру пересоздал, а флажок ANSI_NULLS не опустил - все работать перестало).

Хотелось бы узнать, кто как пишет?
И действительно ли дурной стиль?

Только одно соображение: ведь сравнение с NULL все-таки имеет право быть. Например, в простейшей процедуре:

Код: plaintext
1.
2.
3.
CREATE PROCEDURE SimleProc (@val int)
AS
SELECT * FROM SimpleTable 
WHERE SimpleField=@val


Ведь имеем мы право получить все пустые (NULL) значения с помощью такой процедуры?

В общем, просьба высказать мнение.
Спасибо!
...
Рейтинг: 0 / 0
02.12.2002, 21:30:09
    #32074870
Dran
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ANSI_NULLS
Коллеги, ваши правы
обратите внимание на 2 веши

@var is null
и функцию isNull(@val1,@val2)

с помощью isNull очень часто можно писать локаничные запросы в where

Пользоваться @input_parameter = NULL, или любыми другими операторами сравнения, достаточно опасно при любых установках.
В форуме как то было обсуждение экспериментов с SET ANSI_NULLS, и последствий применения сранения с неопределенным значением (null)

С уважением, Сергей.
p.s. в вашем случае я бы написал
WHERE SimpleField=@val or @val is null
...
Рейтинг: 0 / 0
03.12.2002, 00:45:39
    #32074881
Александр Азаркович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ANSI_NULLS
Уважаемый Сергей,
благодарю за ответ.

>>достаточно опасно при любых установках

вот в этом и вопрос: в чем опасность-то? Ну если кто-то процедуру перекомпилил без меня - это все-таки проблема организационная, а не техническая. Или я неправ?

>>WHERE SimpleField=@val or @val is null
- совсем не понятно, задачи не решает.

Ну вот еще простейший пример: в таблице описаны иерархические отношения - два поля: id, id_parent. Очевидно, что для элементов верхнего уровня id_parent=NULL. Значит ли это, что для получения всех элементов верхнего уровня нужно писать отдельный кусок кода:
Код: plaintext
where id_parent is null


или вполне нормально (с точки зрения стиля!) универсальное

Код: plaintext
where id_parent=@idParent


???
...
Рейтинг: 0 / 0
03.12.2002, 07:50:45
    #32074901
Dran
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ANSI_NULLS
пардон: если в вашей процедуре поставить условие
WHERE SimpleField=@val or (@val is null and SimpleField is null)
то для получения желаемой вами выборки, где SimpleField null достаточно передать в качестве параметра процедуры @val=null

а в случае с деревом тоже самое where
id_parent=@idParent or (@idParent is null and id_parent is null)
или так, я делал раньше, когда не знал про is null операнд, пользовался функцией
where isNUll(@idParent,'-1000')=isNUll(id_parent,'-1000')
здесь -1000 заведомо невозможное значение id узла, это IMHO криво.


сравнивать с null очень непросто (вы знаете чему равно неопределенное значение?) соответственно использование его сравнения и операций основанных на нем, например сортировка и т.д. могут привести к очень труднодеагностируемым ошибкам, а если еще и джойны в запросе...

з.ы. для примера попробуйте воспользоваться поиском в форуме это подробно разбиралось

С уважением, Сергей.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование ANSI_NULLS / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]