我正在尝试将一个计算的`BIT列添加到我的表中,但我很难理解为什么SQL不会将其视为NOT NULL。我做错了什么,或者这是不可能的?
例如,请选择此表:
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
列是不可能的?
答案 0 :(得分:2)
这是完全黑客攻击,但似乎有效。
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
本身会明确地返回一个值。而且,如果通过上面的黑客攻击,我们会避免一些奇怪的情况,并可能是一个错误。