#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
это устаревшая функция , которая будет удалена в какой-то момент в будущем.