如果不使用動態SQL,而不是使用If
ELSE
有什麼方法可以測試一個表是否具有全文索引而不會導致額外的鎖定。在沒有全文索引的表上使用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,也沒有使用IF
ELSE
?
獎勵分數,如果你能解釋爲什麼優化器不會短路1 = 0和CONTAINS從SELECT * FROM Cars WHERE 1=1 OR (1=0 AND CONTAINS(*, 'fast'))
。
實際上,我可能會創建一個新的類屬性,然後使用它來忽略ORM中的全文索引,但我有興趣查看是否有其他選項。
關於爲什麼優化器不會使您的狀況短路,簡單的答案是SQL Server在構建執行計劃時不會短路。它可能不會評估執行中的某些條件(雖然它的行爲與短路仍然不同),但在編譯時檢查所有組件是否有效。 – MatBailie 2012-01-30 11:54:35
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