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, оно заменит существующее значение.Но это потребует от меня много изменений, поэтому я оставляю это как последний вариант.И если нет простого способа изменить мои текущие настройки, я также открыт для других более совершенных конструкций для этого типа сценария использования.