在SQL Server中创建一个计算的持久列以用作主键

时间:2013-09-24 13:43:57

标签: 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) 

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

对此有何建议?

2 个答案:

答案 0 :(得分:4)

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

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,

也有效。

答案 1 :(得分:0)

create table studentTable (
id int identity(1,1) not null,
--Auto PRIMARY key
student_id AS (RIGHT('S00' + CAST(Id AS VARCHAR(7)), 7)) PERSISTED PRIMARY KEY,
student_name varchar(50)
)

-------------------------------------------------------------
insert into studentTable (student_name) values('Test1')
insert into studentTable (student_name) values('Test2')
insert into studentTable (student_name) values('Test3')`