4

基本的にこれを行う必要があるインデックス付きビューがあります

SELECT ... 
    CASE 
         WHEN ISDATE(ColumnName) = 1 THEN CONVERT(datetime, ColumnName, 103) 
         ELSE NULL 
    END AS ViewColumn
....

インデックスを作成しようとすると、次のようになります。

ビュー'....'にインデックスを作成できません。関数'isdate'は、非決定論的な結果を生成します。決定論的システム関数を使用するか、ユーザー定義関数を変更して決定論的結果を返します。

MSDNによると

ISDATEは、CONVERT関数で使用し
、CONVERTスタイル・パラメーターが指定されていて、スタイルが0、100、9、または109に等しくない場合にのみ決定論的です。

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

しかし、それが何を意味するのかはまったくわかりません。私の知る限り、CONVERT関数で使用しています。

これを回避する方法はありますか?

4

2 に答える 2

4

あるとすれば、次のようにする必要があります。

SELECT ... 
    CASE 
         WHEN ISDATE(ColumnName) = 1 THEN CONVERT(datetime, ColumnName, 103) 
         ELSE NULL 
    END
....

ただし、次のような式がないため、ISDATE WITH CONVERT を使用していません。

ISDATE(CONVERT(varchar,ColumnName,112)) 

ネストされた変換がないと、戻り値は言語設定などに依存するため、非決定的な動作になります。「外部」の知識がなければ、入力だけに基づいて得られる結果を予測することはできません。

于 2012-01-25T18:00:58.670 に答える
0

参照 インデックス付きビューの要件は何ですか?インデックス付きビューを使用するときに考慮する必要のある要件がいくつかあります。

    1. View definition must always return the same results from the same underlying data.
    2. Views cannot use non-deterministic functions.
    3. The first index on a View must be a clustered, UNIQUE index.
    4. If you use Group By, you must include the new COUNT_BIG(*) in the select list.
    5. View definition cannot contain the following
        (A) TOP
        (B) Text, ntext or image columns
        (C)DISTINCT
        (d)MIN, MAX, COUNT, STDEV, VARIANCE, AVG
        (E)SUM on a nullable expression
        (F)A derived table
        (G)Rowset function
        (H)Another view
        (I)UNION
        (J)Subqueries, outer joins, self joins
        (K)Full-text predicates like CONTAIN or FREETEXT
        (L)COMPUTE or COMPUTE BY
        (M)Cannot include order by in view definition
于 2012-01-25T18:53:03.537 に答える