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

时间:2017-03-12 04:43:34

标签: sql-server calculated-columns

我正在尝试将一个计算的`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),
)

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

enter image description here

我是否遗漏了某些内容,或者使用非持久计算的BIT列是不可能的?

1 个答案:

答案 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本身会明确地返回一个值。而且,如果通过上面的黑客攻击,我们会避免一些奇怪的情况,并可能是一个错误。