非空日期如何在视图中变为可空

Posted

技术标签:

【中文标题】非空日期如何在视图中变为可空【英文标题】:How did a not null date become nullable in a view 【发布时间】:2014-01-27 11:27:08 【问题描述】:

我在名为 dbo.Traffic 的表中有一个日期时间字段

我正在尝试按天汇总流量数据。我正计划创建一个模式绑定视图并添加一个索引。

CREATE VIEW [dbo].[vwTraffic] WITH SCHEMABINDING AS

SELECT  CONVERT(date, CreateDate) as CreateDate, Circuit, Fuseaction,     
   COUNT(CreateDate) AS activity
FROM    dbo.Traffic WITH (NOLOCK)
GROUP BY CONVERT(date, CreateDate), Circuit, Fuseaction

在基表中,CreateDate 不可为空。但是,一旦我创建了一个视图并将其转换为日期,它就会变为可为空。

【问题讨论】:

删除 with (nolock) 没有帮助 【参考方案1】:

这是因为计算列在可空性方面的行为方式。签到here on MSDN:

数据库引擎会根据使用的表达式自动确定计算列的可空性。即使只有不可为空的列存在,大多数表达式的结果也被认为是可空的,因为可能的下溢或溢出也会产生空结果。使用具有 AllowsNull 属性的 COLUMNPROPERTY 函数来调查表中任何计算列的可空性。 可以通过指定 ISNULL(check_expression, constant) 将可空表达式转换为不可空表达式,其中常量是替换任何空结果的非空值

您可以将其用作您的CreateDate。你不必担心常量值,因为你不应该有NULL

ISNULL(CONVERT(date, CreateDate),0) as CreateDate

【讨论】:

以上是关于非空日期如何在视图中变为可空的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin - 可空字段的非空 getter

如何在 Rails 迁移中将可空列更改为不可空?

Firebase,Swift:返回类型上的可空性说明符冲突,“可空”与现有说明符“非空”冲突

Firebird 列可空非空修改

Kotlin空安全 ③ ( 手动空安全管理 | 非空断言操作符 !! | 使用 if 语句判空 )

MySQL中建表时可空(NULL)和非空(NOT NULL)的一些思考