2011-01-17 18 views
0

計算列をインデックスする必要があるため、インデックスを作成することを望んでいるビューがあります(これはエラーコード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]) 

失敗しています。

私は本当に前にトリガを使用していないが、私はDateView

答えて

1

あなたを置き換えるために新しいテーブルに検出するために、それらを使用し、基礎となるSourceDataテーブルへの変更をフィルタリングし、それらを適用することができるはず理解実際の日時列として固有キーを実体、および(挿入および更新に)トリガを使用して、それを維持することができる

本当のdatetime型として列を追加します
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]) 
関連する問題