Эквивалентно NULL в SQL Server - PullRequest
0 голосов
/ 11 мая 2018

TL; DR Есть ли что-то эквивалентное NULL, или какой-то флаг, который можно использовать для обработки его как NULL?Можно задать пустую строку, но она не выглядит корректной (и столбец может иметь целочисленный тип).

У меня есть Table1, который выглядит следующим образом:

Table1 (Id (PK, NOT NULL), Col1 (NOT NULL), Col2 (NOT NULL), Col3)

Только в этом Col3 может содержать значение NULL, другие обязательные столбцы.Теперь я хочу обновить запись в этой таблице, но она должна быть одобрена кем-то, поэтому у меня есть другая таблица Table1Change, которая выглядит следующим образом:

Table1Change (Id (PK, NOT NULL), Table1Id (FK, NOT NULL), Col1, Col2, Col3)

Col1, Col2, Col3 может быть NULL.Если они имеют ненулевое значение, это означает, что он заменит значение этого столбца в Table1.Таким образом, хранимая процедура ApproveUpdate будет выглядеть примерно так:

UPDATE Table1
SET Col1 = ISNULL(Table1Change.Col1, Table1.Col1),
    Col2 = ISNULL(Table1Change.Col2, Table1.Col2),
    Col3 = ISNULL(Table1Change.Col3, Table1.Col3)
FROM Table1
INNER JOIN Table1Change ON Table1.Id = Table1Change.Table1Id
WHERE Table1.Id = @table1Id  
  AND Table1Change.Id = @table1ChangeId;

Одна из проблем, связанных с описанным выше подходом, состоит в том, что предположим, что у меня есть значение в Col3 из Table1, и теперь я хочу удалить его (и я должентак как Col3 может быть NULL), в Table1Change просто установка значения в NULL не будет работать.Поскольку ISNULL примет исходное значение столбца.

Итак, теперь мой вопрос, есть ли что-то эквивалентное NULL, или какой-то флаг, который я могу использовать, чтобы установить значение для Col3 в Table1Change, поэтому, если это установлено, хранимая процедура сделает Col3 в Table1 NULL.Может быть задана пустая строка, но она выглядит не очень хорошо (и Col3 может иметь целочисленный тип).

Еще один известный мне вариант - изменить способ обработки таблицы Table1Change.Новая схема будет выглядеть следующим образом:

Table1Change(Id (PK, NOT NULL), Table1Id(FK, NOT NULL), Col1(NOT NULL), Col2(NOT NULL), Col3)

Теперь, если будет какое-либо обновление строки до Table1, все данные будут скопированы в Table1Change с обновленным полем.Что-то вроде (Col1, Col2, Col3)(oldValue, oldValue, newValue).Теперь проблема решена, так как ApproveUpdate просто скопирует всю запись в исходную таблицу, поэтому, если значение newValue равно NULL, оно заменит существующее значение.Но это потребует от меня много изменений, поэтому я оставляю это как последний вариант.И если нет простого способа изменить мои текущие настройки, я также открыт для других более совершенных конструкций для этого типа сценария использования.

1 Ответ

0 голосов
/ 11 мая 2018

Нуль не может использоваться здесь для обозначения двух вещей:

  • не обновлять значение
  • установить значение на ноль.

Нет 2 типов Null, которые позволили бы вам различать 2 сценария.

Вам придётся поработать над этим, вы можете использовать некоторые «магические» значения, чтобы обозначить перекрытие поля, хотя я не совсем заинтересован в этом варианте. (Это позволяет вам реализовать это без изменения таблицы, просто изменение логики процесса.)

Вы можете в равной степени добавить дополнительные столбцы в Table1Change, например BlankCol1, BlankCol2, BlankCol3, в качестве логических (битовых) столбцов и использовать их для обозначения, если значение должно быть пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...