2

我正在尝试开发一个唯一索引。

CREATE UNIQUE NONCLUSTERED INDEX NCI_NewUnique
ON [NewUnique]([U1])
WHERE (ISNULL([MyField], '') = '') 

我的错误是

Incorrect WHERE clause for filtered index 'NCI_NewUnique' on table 'NewUnique'.

这是另一种尝试;这个我已经删除了 ISNULL(MyField, '') 部分。为什么这个不能有一个OR

CREATE UNIQUE NONCLUSTERED INDEX NCI_NewUnique
ON [NewUnique]([U1])
WHERE (
         ([MyId] IS NULL) 
         OR 
         ([MyId] IS NOT NULL AND [MyField] IS NOT NULL)
      )

错误是:

Incorrect syntax near the keyword 'OR'.
4

2 回答 2

3

我不知道为什么,但根据文档功能,or是不允许的。

<filter_predicate> ::= 
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,...n)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }
于 2012-04-13T03:20:01.597 回答
0

我发现这个问题面临一个问题,如何在过滤器表达式中使用 ISNULL 或 OR 制作过滤后的唯一索引。因此,虽然“那是不允许的”是一个有效的答案,但它对我的情况没有帮助。

不过,我确实找到了我的问题的答案,所以这里是为其他像我一样会找到它的人准备的。

您可以使用模式绑定创建视图,将复杂的过滤器放入其中并为视图创建唯一的聚集索引!这是一个 hack,但它可以工作,优化器甚至可以在查询表时选择这个索引。

更多细节在这里:

https://dba.stackexchange.com/questions/116347/unable-to-create-a-filtered-index-on-a-computed-column

于 2019-12-17T11:12:03.927 回答