Ответ 1
Вы можете обмануть это с помощью ISNULL(Price + Taxes, 0)
, который использует значение по умолчанию 0 для вычислений NULL.
В SQL Server 2005 возможно создать вычисленный столбец, который сохраняется и определяется как NOT NULL (не может содержать нулевое значение). Второй атрибут имеет важное значение при использовании библиотек, таких как Linq2Sql, если мы хотим избежать много ручной работы, чтобы гарантировать, что наш код будет иметь значение "всегда".
С прямым SQL это очень просто: ALTER TABLE Sales ADD Total AS (Price + Taxes) PERSISTED NOT NULL
При просмотре в окне дизайна студии SQL Server Management этот столбец корректно отображается как вычисленный столбец без флажка "Разрешает nulls". Однако я столкнулся с проблемой создания новых столбцов в дизайнере для соответствия этому шаблону: формула вводится в свойство Computed Column Specification → (Formula), а сохраняемое свойство задается установкой Is Persisted на Yes, но попытка снять отметку 'allow nulls' в новом вычисляемом столбце приводит к диалогу, в котором указано, что свойство не может быть изменено.
Мне нужно охватить широкий диапазон уровней навыков, и для этого мне нужно предоставить процедуры для добавления столбцов, которые могут следовать даже новичку (что означает окно дизайнера Management Studio). Есть ли какой-то секрет в SQL Server Management Studio для создания нового расчетного столбца как NOT NULL в дизайнере, аналогично тому, как CTRL + 0 можно использовать для вставки нулей в ячейки?
Вы можете обмануть это с помощью ISNULL(Price + Taxes, 0)
, который использует значение по умолчанию 0 для вычислений NULL.
Как отмечает Scoregraphic, вы можете сделать это с помощью ISNULL
.
Я часто использую это для вычисленных флагов, например, в таблице User
, у меня есть DeletedDate
, чтобы узнать, когда была удалена учетная запись. Затем я создаю вычисленный невозбудимый логический столбец с именем IsDeleted
(тип бит) следующим образом:
isnull(case when DeletedDate is null then 0 else 1 end, 0)
Важно отметить, что ISNULL должен быть в самой внешней части выражения для конструктора, чтобы понять, что это вычисляемый столбец, не содержащий NULL.
Я попробовал это и посмотрел на дерево слева слева, и он действительно установил столбец как не равный null, хотя в дизайнере правой панели флажок не был отмечен...
ALTER TABLE Sales ADD Total AS ISNULL(isnull(Price,0) + isnull(Taxes,0),0) PERSISTED NOT NULL
В соответствии с эта статья nullability определяется sqlserver на основе возможного значения вычисленного выражения. Поскольку Price
или Taxes
, вероятно, имеет значение NULL, он не может быть уверен, что их сумма никогда не равна null.
Однако, как предполагает @Рихард, использование метода ISNULL
позволяет избежать этого. Однако объявление столбца NOT NULL
не обязательно, насколько я понял.