sql-server - 在 SQL Server 中创建计算持久列用作主键

标签 sql-server

我有一个包含两列的表格,如下所示:

[logTime] [datetime] NOT NULL,
[wDate]  AS (CONVERT([date],isnull([logtime],'2012-01-01'),0)) PERSISTED,

我正在尝试更改计算的 wDate 列公式以保存 logtime 的日期部分并能够将其用作索引。应保留该列。

如果我使用:

ISNULL(Convert(date,logtime,0),Convert(date,'2012-01-01',0)) 

我收到错误消息,指出该列无法持久保存,因为该列是不确定的。

如果我使用

CONVERT([date],isnull([logtime],'2012-01-01'),0) 

我无法清除“允许空”复选框以在主索引中使用它。

对此有什么建议吗?

最佳答案

这有效(我没有完整的表格定义,所以我做了一个):

create table T (
    [logTime] [datetime] NOT NULL,
    ID int not null,
    [wDate] AS ISNULL(DATEADD(day,DATEDIFF(day,0,[logtime]),0),
                      CONVERT(date,'20120101',112)) PERSISTED,
    constraint PK_T PRIMARY KEY (ID,wDate)
)

就像这样 - 我做了很多摆弄来尝试让它工作:

[wDate] AS ISNULL(CONVERT(date,[logtime],112),
                  CONVERT(date,'20120101',112)) PERSISTED

这一秒将 wDate 获取为 date 而不是 datetime,这可能是您想要实现的目标的一部分。但是,第一个永远不会产生非午夜时间,因此总体而言它们是可比的。

<小时/>

最后,Doh!:

[wDate] AS CONVERT(date,[logtime],112) PERSISTED,

也有效。

关于sql-server - 在 SQL Server 中创建计算持久列用作主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18983368/

相关文章:

sql-server - 从 SQL Server 多表查询创建单个 XML

sql-server - 如何将选择列存储在变量中?

sql - 请问有人能解释为什么在SQL Server 2005中删除和重新创建存储过程会导致最初的速度下降比预期的要多得多吗?

sql-server - 创建附加全文目录的指南

sql-server - 错误: Unsupported PIVOT column type: text

sql - 将 nvarchar 数据类型转换为日期时间数据类型导致值超出范围

sql-server - 如何对字母文本字段进行排序?

sql - SQL Server 根据条件插入和更改数据

sql - 永远不会结束带有麻烦的内连接的选择

c# - 存储过程和 SqlCommand 超时