2011-07-18 37 views
0

テーブルTableAと、計算列FieldAがfloatを返す関数にバインドされています。この関数は2つのサブ関数を呼び出すGetFieldAです。計算された列関数を使用したスキーマバインド

フィールドとして計算された列の値ではなく、GetFieldAの機能を含むビューもあります。私はちょうどそれがインデックスを持っているためにバインドされたスキーマにGetFieldAが必要と言ったビューにインデックスを追加しようとしましたが、私はスキーマにバインドされた(計算されたカラムを削除することになりました) GetFieldAを使用するために計算された列を読み取るようにしてください。スキーマのバインドを削除する必要があります。

計算された列にスキーマバインドされた関数を持たせる方法はありますか、ビューのインデックスを持つためにはフィールドを取得する方法をやり直す必要がありますか?

+1

確定的な関数は、スキーマにバインドされたビューでよく索引付けされます。スクリプトを投稿してください。 – Quassnoi

答えて

1

決定的なものでない限り、計算カラムにインデックスを追加することは不可能です。

"Deterministic関数は、特定の入力値セットで呼び出され、データベースの同じ状態が与えられると、常に同じ結果を返します。非決定的関数は、特定のセットで呼び出されるたびに異なる結果を返すことがあります。アクセスするデータベースの状態が同じであっても入力値を使用できます。

例:あなたは、他の場合には、あなたが自由にインデックスを作成することができ、[real][float]などの不正確なデータ型のPERSISTEDを指定する必要が

CREATE FUNCTION dbo.FuncA() 
RETURNS [float] 
WITH SCHEMABINDING -- required option 
BEGIN 
    RETURN 1.0 -- DB engine parses body, and marks this func. as 'deterministic' 
END 
GO 

CREATE TABLE TableA (
    K int primary key clustered, 
    A AS dbo.FuncA() PERSISTED -- must be persisted 
) 
GO 

CREATE VIEW ViewA 
WITH SCHEMABINDING -- required option 
AS 
    SELECT K, A FROM dbo.TableA 
GO 

CREATE UNIQUE CLUSTERED INDEX IDX1 ON dbo.ViewA (K, A) 
GO 

計算列([小数点]はOK)で表示されます。

+0

私はテーブルAのフィールドAを永続化させたいと思っています。私はあなたの意見を誤解しています。SELECT dbo.FuncA(float値)dbo.TableAから選択しない – Manatherin

+0

不正確なデータ型に対してはPERSISTEDを指定する必要があります。 [実数]や[浮動小数点数]のように、他の場合には、計算カラム([小数点]はOK)でビューに自由にインデックスを作成することができます。 'CREATE VIEW .. SELECT dbo.Func()'を意味します。ここで 'dbo.Func()'は10進数(18,4)を返します。しかし、 'dbo.Func()'が[float]を返す 'dbo.Func2()'を呼び出すと、うまく動作しません。 –

+0

これは決定的な答えと思われます。残念なことに私の関数は別の関数を呼び出し、その関数もまた決定的ではないので、私は自分のアプローチを書き直す必要があります – Manatherin

関連する問題