2012-01-30 13 views
1

如果不使用動態SQL,而不是使用IfELSE有什麼方法可以測試一個表是否具有全文索引而不會導致額外的鎖定。在沒有全文索引的表上使用CONTAINS進行查詢

我正在尋找一些方法,我仍然可以執行:

SELECT * FROM Cars WHERE <not has full text index> OR (<has full text index> AND CONTAINS(*, 'fast')) 

有沒有這方面的全文索引的表Cars理想我想它只是返回所有行,當我們嘗試並指定包含字符串。

我所擁有的目前由SQL是:

SELECT * FROM Cars 
WHERE NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = object_id('Cars') AND COLUMNPROPERTY(object_id, name, 'IsFulltextIndexed') = 1) 
OR (EXISTS (SELECT 1 FROM sys.columns WHERE object_id = object_id('Cars') AND COLUMNPROPERTY(object_id, name, 'IsFulltextIndexed') = 1) 
AND CONTAINS(*, 'fast')) 

,它解析罰款,但因爲失敗:

消息7601,級別16,狀態1,3行無法使用CONTAINS或FREETEXT 表或索引視圖上的謂詞'Cars',因爲它不是全文索引 。

有沒有辦法做到這一點沒有動態SQL,也沒有使用IFELSE

獎勵分數,如果你能解釋爲什麼優化器不會短路1 = 0和CONTAINS從SELECT * FROM Cars WHERE 1=1 OR (1=0 AND CONTAINS(*, 'fast'))

實際上,我可能會創建一個新的類屬性,然後使用它來忽略ORM中的全文索引,但我有興趣查看是否有其他選項。

回答

0

號所有單查詢被編譯成一個單一的計劃,所以所有的單個組件必須始終是有效的。在不同的情況下,不同的組件在不同的情況下是有效的,所以不可能寫出單個的聲明

這樣做需要更傳統的程序結構。這些在T-SQL中可用,但不在單個SQL語句中。因此,您列出的解決方案實際上是解決此類問題的方法。

+0

關於爲什麼優化器不會使您的狀況短路,簡單的答案是SQL Server在構建執行計劃時不會短路。它可能不會評估執行中的某些條件(雖然它的行爲與短路仍然不同),但在編譯時檢查所有組件是否有效。 – MatBailie 2012-01-30 11:54:35

+0

http://weblogs.sqlteam.com/mladenp/archive/2008/02/25/How-SQL-Server-short-circuits-WHERE-condition-evaluation.aspx – MatBailie 2012-01-30 12:22:09

相關問題