Пометка сохраненных вычисляемых столбцов NOT NULL в SQL Server Management Studio - PullRequest
16 голосов
/ 12 января 2010

В SQL Server 2005 можно создать вычисляемый столбец, который будет сохранен и определен как NOT NULL (не может содержать нулевое значение). Второй атрибут важен при использовании таких библиотек, как Linq2Sql, если мы хотим избежать много ручной работы, чтобы гарантировать нашему коду, что столбец «всегда» имеет значение.

С прямым SQL это очень просто:
ALTER TABLE Sales ADD Total AS (Price + Taxes) PERSISTED NOT NULL

При просмотре в окне разработки SQL Server Management studio этот столбец корректно отображается в виде вычисляемого столбца без галочки для «разрешенных нулей». Однако я столкнулся с проблемой создания новых столбцов в конструкторе, чтобы они соответствовали этому шаблону: формула вводится в свойство «Спецификация вычисляемого столбца -> (формула)», а постоянное свойство указывается с помощью параметра «Сохранено» в «Да», но при попытке снять флажок «разрешает пустые значения» в новом вычисляемом столбце приводит к появлению диалогового окна, в котором «свойство не может быть изменено».

Мне нужно охватить широкий диапазон уровней квалификации, и для этого мне нужно предоставить процедуры для добавления столбцов, которым может следовать даже новичок (что означает окно дизайнера Management Studio). Есть ли какой-то секрет в SQL Server Management Studio для создания нового вычисляемого столбца как NOT NULL в конструкторе, подобно тому, как можно использовать CTRL + 0 для вставки нулей в ячейки?

Ответы [ 4 ]

18 голосов
/ 12 января 2010

Вы можете обмануть это с помощью ISNULL(Price + Taxes, 0), который использует значение по умолчанию 0 для вычислений NULL.

10 голосов
/ 12 января 2010

Как отмечает Scoregraphic, вы можете сделать это с помощью ISNULL.

Я часто использую это для вычисляемых флагов, например, в таблице User, у меня есть DeletedDate, чтобы знать, когда была удалена учетная запись. Затем я создаю вычисляемый необнуляемый логический столбец с именем IsDeleted (тип бит), например:

isnull(case when DeletedDate is null then 0 else 1 end, 0)

Важно отметить, что ISNULL должен находиться в самой внешней части выражения, чтобы конструктор понял, что это вычисляемый столбец, который не может быть равен нулю.

2 голосов
/ 12 января 2010

Я попробовал это и, глядя на древовидное представление слева, он действительно установил столбец как не нулевой, хотя в конструкторе правой панели флажок не был установлен ...

ALTER TABLE Sales ADD Total AS ISNULL(isnull(Price,0) + isnull(Taxes,0),0) PERSISTED NOT NULL
1 голос
/ 12 января 2010

Согласно эта статья Обнуляемость определяется sqlserver на основе возможного значения вычисляемого выражения. Поскольку Price или Taxes, вероятно, могут быть обнуляемыми, нельзя быть уверенным, что их сумма никогда не равна нулю.

Однако, как предполагает @Richard, использование метода ISNULL позволяет избежать этого. Однако, как я понял, объявление колонки NOT NULL не должно быть необходимым.

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