如果不使用动态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