Сравнение полей с нулевым значением в хранимой процедуре

#tsql #sql-server-2008 #stored-procedures

#tsql #sql-server-2008 #хранимые процедуры

Вопрос:

У меня проблема с хранимой процедурой. Это сравнение новой записи с существующей для проверки изменений. Это делается следующим образом:

 SELECT 1 FROM Table
WHERE Id= @Id
AND Field1 = @Field1
AND Field2 = @Field2
AND Field3 = @Field3
AND Field4 = @Field4
AND Field5 = @Field5
AND LEDTS IS NULL
  

Похоже, это не работает, когда поля имеют значение NULL. Я знаю, что = NULL работает не так, как вы могли бы ожидать, но я не знал, что он также терпит неудачу в подобных вещах. Когда я меняю сравнение полей на такие вещи, как

 (Field1 IS NULL AND Field2 IS NULL) OR Field1 = @Field2
  

это действительно работает. Есть ли лучший способ сделать это?

Комментарии:

1. Меня тоже интересует это раздражение.

2. Если вы публикуете образцы кода, XML или данных, ПОЖАЛУЙСТА , выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ( { } ) на панели инструментов редактора, чтобы красиво оформить и выделить синтаксис!

Ответ №1:

SET ANSI_NULLS можно управлять этим поведением…Настройка SET ANSI_NULLS OFF приведет NULL = NULL к вычислению значения true.

Но я бы рекомендовал не устанавливать фактическую настройку SET ANSI_NULLS OFF , а вместо этого попытаться ограничить поля в базе данных, которые являются «обнуляемыми».

Комментарии:

1. Я бы также рекомендовал отказаться от этого, тем более что SET ANSI_NULLS OFF это устаревшая функция .

2. Спасибо. К сожалению, я не могу ограничить количество полей с нулевым значением, поэтому я использую опцию ANSI_NULLS . Но я постараюсь использовать это с умом 😉

3. @JoeStefanelli хорошо, но что бы вы порекомендовали вместо этого для проведения надлежащих проверок?

4. Несмотря на то, что это громоздко, опубликованное вами сравнение является хорошим способом проверки нулевых значений.

Ответ №2:

Вы можете использовать проверки, подобные этой:

 ISNULL(Field1, '') = ISNULL(@Field1, '')
  

Для этого есть обратная сторона: вы можете иметь такие равенства, как

 NULL='' or ''=NULL
  

Я не знаю, может ли это быть приемлемым в вашем сценарии.

Комментарии:

1. Это нормально, если производительность не является проблемой, но это невозможно.

Ответ №3:

Это поведение определяется ANSI_NULLS настройкой. Это значение по умолчанию ON равно и должно быть установлено таким образом, чтобы различные вещи работали правильно (например, индексированные представления и распределенные запросы), но если они вам не требуются, вы можете отключить его.

Подробнее об этом читайте в книгах онлайн.

Комментарии:

1. Поскольку я прокомментировал другой ответ, обратите внимание, что SET ANSI_NULLS OFF это устаревшая функция , которая будет удалена в какой-то момент в будущем.