[SQL]使用Filtered Index要注意的地方

[SQL]使用Filtered Index要注意的地方

最近建立一個Filtered Index後,程式呼叫SP時,居然出現以下的錯誤,

<System.Data.SqlClient.SqlException> UPDATE 失敗,因為下列 SET 選項的設定錯誤: 'QUOTED_IDENTIFIER'。
請確認與 索引檢視表及/或計算資料行上的索引及/或篩選的索引及/或查詢通知及/或 XML 資料類型方法及/或空間索引作業 一起使用的 SET 選項是否正確。
[ SqlException.Number : 1934, SqlException.LineNumber : 101, SqlException.State : 1 ]

 

看起來是因為建立 Filtered Index 使用的 QUOTED_IDENTIFIER 是 ON,而SP使用的是 OFF。

解法有2個,

1.不要使用Filtered Index(因為使用Filtered Index QUOTED_IDENTIFIER 一定要為ON,但index的size會變大),一般的Index則不需要一定要設成ON。

2.重新建立該SP,以SET QUOTED_IDENTIFIER ON來建立。

 

可以參考「Filtered Index and QUOTED_IDENTIFIER issue in SQL Server 2008」查看DB中的SP有那些設定「QUOTED_IDENTIFIER」為OFF。


SELECT o.name
FROM   sys.sql_modules m
JOIN   sys.objects o ON m.object_id = o.object_id
WHERE  (m.uses_quoted_identifier = 0 or
m.uses_ansi_nulls = 0)
AND  o.type NOT IN ('R', 'D')

 

我們的DB中有7百多支是設定成OFF~~ 奇怪,SET QUOTED_IDENTIFIER ON,不是預設值嗎?

 

參考資料

Filtered Index and QUOTED_IDENTIFIER issue in SQL Server 2008

SET QUOTED_IDENTIFIER

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^