2013-09-24 45 views
3

我有两列如下表:创建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) 

我不能清除允许空复选框中的主索引使用它。

对此有何建议?

+0

'logtime'不允许为空 - 为什么要用'ISNULL'包装它呢? –

+0

它不允许空值,但S​​QL Server不会允许我取消选中wDate列的'允许空值' – Rahmatizadeh

回答

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,这可能是你想达到什么样的一部分。但是,第一个永远不会产生非午夜时间,所以总体上它们是可比的。


最后,卫生署!:

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

也适用。

+0

第二个工作正常。但第三种解决方案不允许清空允许空值。感谢您的帮助。 – Rahmatizadeh

-1
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')`