Sql server 非持久化计算位列是否为非空?
我试图向表中添加一个computed`BIT列,但我很难理解为什么SQL不会将其视为非NULL。我做错了什么,还是这不可能 例如,以下表为例:Sql server 非持久化计算位列是否为非空?,sql-server,calculated-columns,Sql Server,Calculated Columns,我试图向表中添加一个computed`BIT列,但我很难理解为什么SQL不会将其视为非NULL。我做错了什么,还是这不可能 例如,以下表为例: CREATE TABLE MyTable ( SomeDate DATETIME NOT NULL, DateIsInPastInt AS CASE WHEN SomeDate < GETUTCDATE() THEN 1 ELSE 0 END, DateIsInPastBit AS CAST(CASE WHEN SomeDa
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),
)
创建表MyTable(
SomeDate日期时间不为空,
DateIsInPastin,如SomeDate
对于两列DateIsInPastin
和DateIsInPastBit
,从逻辑上讲,这两列都不可能为NULL
。但是,SQL将DateIsInPostBit
定义为可空:
我是否遗漏了一些内容,或者对于非持久化的
位列,这是不可能的?这是一个彻底的攻击,但似乎有效
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)
)
创建表MyTable(
SomeDate日期时间不为空,
DateIsInPastin,如SomeDate
也就是说,我很想知道为什么它似乎不认为cast
本身会明确地返回一个值。而且,如果通过上面的破解,我们可以避免一些奇怪的情况和潜在的bug。是的,这确实有效!实际上,我尝试了类似的方法,但将ISNULL
检查放在CAST
中,但仍然不起作用。出于某种原因,我在想,我需要在外部使用CAST
,才能识别类型。谢谢