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]) 

これは失敗します。

これまでトリガーを実際に使用したことはありませんが、トリガーを使用して、基になる SourceData テーブルへの変更を検出およびフィルター処理し、それらを新しいテーブルに適用して DateView を置き換えることができるはずだと理解しています

4

1 に答える 1

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]) 
于 2011-01-17T19:21:53.927 に答える