8

タイプの計算列にインデックスを作成すると、nvarchar次のエラーが発生します。

計算列 'MyColumn' が不正確で永続化されていないため、テーブル 'MyTable' にインデックスまたは統計 'MyIndex' を作成できません。インデックスまたは統計キーから列を削除するか、計算列を永続化することを検討してください。

不正確な列 とはどういう意味ですか?

アップデート。定義は次のとおりです。

alter table dbo.MyTable
    add [MyColumn] as dbo.MyDeterministicClrFunction(MyOtherColumn)
go  
create index MyIndex on dbo.MyTable(MyColumn)
go

更新 2。は次のMyDeterministicClrFunctionように定義されます。

[SqlFunction(IsDeterministic = true)]
public static SqlString MyDeterministicClrFunction(SqlString input)
{
    return input;
}
4

3 に答える 3

9

MSDN によると、CLR Function 列は、インデックスを作成するために永続化する必要があります。

共通言語ランタイム (CLR) 式を含むすべての計算列は、列にインデックスを付ける前に決定論的であり、PERSISTED とマークされている必要があります。計算列の定義では、CLR ユーザー定義型の式を使用できます。型が CLR ユーザー定義型である計算列は、型が比較可能である限り、インデックスを作成できます。詳細については、「CLR ユーザー定義型」を参照してください。

列を永続化すると、うまくいくと思います。

于 2012-05-07T15:07:39.767 に答える
6

SQLサーバーのドキュメントから:

浮動小数点または実数式は不正確と見なされ、インデックスのキーにすることはできません。float または実数式はインデックス付きビューで使用できますが、キーとしては使用できません。これは、計算列にも当てはまります。関数、式、またはユーザー定義関数は、float 式または実数式が含まれている場合、不正確と見なされます。これには、論理的なもの (比較) が含まれます。

于 2012-05-07T14:54:25.077 に答える
1

やってみました:

[SqlFunction(IsDeterministic=true, IsPrecise=true)]

http://msdn.microsoft.com/en-us/library/orm-9780596101404-02-12.aspx

http://msdn.microsoft.com/en-us/library/ms189292.aspx

CLR 計算列は永続化する必要がある (インデックスを作成する) 必要があるため、エラー メッセージが誤解を招くように聞こえます。

于 2012-05-07T15:20:58.600 に答える