非持久计算的 BIT 列为 NOT NULL?

Non-persisted computed BIT column as NOT NULL?

我正在尝试将计算的 `BIT 列添加到我的 table,但我很难理解为什么 SQL 不会将其视为 NOT NULL。我是做错了什么,还是这不可能?

例如,取这个 table:

CREATE TABLE MyTable (
    SomeDate DATETIME NOT NULL,
    DateIsInPastInt AS CASE WHEN SomeDate < GETUTCDATE() THEN 1 ELSE 0 END,
    DateIsInPastBit AS CAST(CASE WHEN SomeDate < GETUTCDATE() THEN 1 ELSE 0 END AS BIT),
)

对于 DateIsInPastIntDateIsInPastBit 这两个列,从逻辑上讲,这两列中的任何一个都不可能是 NULL。但是,SQL 将 DateIsInPastBit 定义为可为空:

我是不是遗漏了什么,或者这对于非持久计算的 BIT 列来说是不可能的?

这是一个彻头彻尾的 hack,但它似乎有效。

CREATE TABLE MyTable (
    SomeDate DATETIME NOT NULL,
    DateIsInPastInt AS CASE WHEN SomeDate < GETUTCDATE() THEN 1 ELSE 0 END,
    DateIsInPastBit AS isnull(cast(
       CASE WHEN SomeDate < GETUTCDATE() THEN 1 ELSE 0 END as bit
    ), 1)
)

也就是说,我很想知道为什么它似乎不认为 cast 本身会明确 return 一个值。而且,如果通过上面的 hack,我们可以避免一些奇怪的情况和潜在的错误。