我有一个视图,我希望创建一个失败的索引,因为我需要索引一个计算列(这失败,错误代码为2729“......不能用于索引或统计信息或作为分区键,因为它是非确定性的。我希望能够用一个触发器或一组触发器替换视图,这将触发索引表。视图非常简单。
给出一张表:
CREATE TABLE SourceData (
ItemId int NOT NULL,
KeyId int NOT NULL,
Value varchar(MAX) NULL
)
我创建了视图:
CREATE VIEW DateView WITH SCHEMABINDING
AS
SELECT CONVERT(DATETIME, Value) As KeyDate,
ItemId FROM dbo.SourceData WHERE KeyId=123
然后我尝试在视图上创建索引:
CREATE NONCLUSTERED INDEX IX_DateView ON dbo.DateView (
[KeyDate] ASC
)
INCLUDE ( [ItemId])
失败了。
之前我没有真正使用过触发器,但我知道我应该能够使用它们来检测和过滤对底层SourceData表的任何更改并将它们应用到新表来替换DateView
答案 0 :(得分:1)
您可以将KeyDate实现为真实日期时间列,并使用触发器(插入和更新时)维护它
将列添加为实际日期时间
alter table SourceData add KeyDate datetime
创建一个触发器来维护它
create trigger CRU_SourceData
on SourceData
after insert, update
as
begin
if update(Value)
update SourceData
set KeyDate = Convert(datetime,inserted.Value)
from inserted
-- assuming itemID uniquely identifies the record
where inserted.ItemId=SourceData.ItemID
end
创建视图
CREATE VIEW DateView WITH SCHEMABINDING
AS
SELECT KeyDate, ItemId FROM dbo.SourceData
WHERE KeyId=123
现在这将有效
CREATE NONCLUSTERED INDEX IX_DateView ON dbo.DateView (
[KeyDate] ASC
)
INCLUDE ( [ItemId])