使用IS NULL或OR的过滤器表达式创建唯一索引

时间:2012-04-13 02:42:36

标签: sql-server-2008 tsql indexing non-clustered-index

我正在尝试开发一个独特的索引。

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'.

2 个答案:

答案 0 :(得分:3)

我不知道原因,但根据documentation函数和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 | = | <> | != | > | >= | !> | < | <= | !< }

答案 1 :(得分:0)

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

我确实找到了问题的答案,所以这里是给任何想要像我一样找到它的人的。

您可以创建带有模式绑定的视图,将复杂的过滤器放入其中,并为该视图创建唯一的聚簇索引!这是一种技巧,但是它可以工作,并且优化器甚至可以在查询表时选择该索引。

更多详细信息在这里:

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