Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 非持久化计算位列是否为非空?_Sql Server_Calculated Columns - Fatal编程技术网

Sql server 非持久化计算位列是否为非空?

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

我试图向表中添加一个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 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
,才能识别类型。谢谢