非持久计算的 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),
)
对于 DateIsInPastInt
和 DateIsInPastBit
这两个列,从逻辑上讲,这两列中的任何一个都不可能是 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,我们可以避免一些奇怪的情况和潜在的错误。
我正在尝试将计算的 `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),
)
对于 DateIsInPastInt
和 DateIsInPastBit
这两个列,从逻辑上讲,这两列中的任何一个都不可能是 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,我们可以避免一些奇怪的情况和潜在的错误。