2012-05-28 77 views
1

我想創建上(列1 =列2)的條件下篩選索引:創建篩選索引

CREATE NONCLUSTERED INDEX [IX_Document_IsBalanced] 
ON [ACC].[Document] ([DocumentID] ASC) 
WHERE SumCredit = SumDebit 
ON [PRIMARY] 
GO 

錯誤信息是:

'與'

關鍵字附近的語法不正確
+2

請發表你正在發佈的聲明 – Quassnoi

+2

另外:你可以在你的過濾索引表達式中有一個* simple *檢查 - 就像'WHERE Column1 IS NOT NULL'或類似的東西。你**不能**但是比較兩列值 - 你將得到一個錯誤消息'Msg 10735,Level 15,State 1,Line 2 表'dbo.XXXXXXX'上的過濾索引'ix_test'的WHERE子句不正確。' –

+0

My T-SQL命令是:CREATE NONCLUSTERED INDEX [IX_Document_IsBalanced] ON [ACC] [文獻]([DocumentID] ASC) WHERE SumCredit = SumDebit ON [PRIMARY] GO –

回答

7

的文檔是在這個問題上相當混亂,但你真的不能創建過濾在此條件下(因爲它不能在過濾的統計信息使用)的索引。

的文檔說:

過濾器謂詞使用簡單的比較邏輯

沒有明確定義的「簡單」,但實際上「簡單」是指「經濾波的統計可用」。這兩者有相同的限制。

統計信息只能使用equalities,ranges和in-lists agains常量。這意味着你只能使用下面的謂詞:

column = const 
column > const 
column < const 
column IN (const1, const1) 

及其變化(BETWEEN等),可能與AND(甚至沒有OR)相結合。

+1

我已成功使用!=在篩選索引上。 – Brandon

-5

篩選索引是SQL Server 2012功能 - 這裏是來自MSDN的documentation的語法

例如:

CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate 
    ON Production.BillOfMaterials (ComponentID, StartDate) 
    WHERE EndDate IS NOT NULL ; 
GO 
+4

不,不,在SQL Server ** 2008中引入了過濾索引**我的朋友.. 。 - 請參閱您自己的MSDN文檔:http://msdn.microsoft.com/en-us/library/cc280372%28v=sql.100%29.aspx –