我正在使用带有Windows Server 2008 Enterprise的SQL Server 2008 Enterprise。我有一个名为“Book”的数据库表,它有很多列,在这个问题中有三列很重要,它们是
我想用以下逻辑编写一个商店程序,但我不知道如何编写(因为复杂的查询条件),如果有人可以为我写一个样本,我会很感激吗?
输入参数:p_author为varchar,p_country为varchar,p_domain为varchar
查询条件:
我想要返回的结果(必须满足以下所有条件):
例如,符合条件1和条件3的记录可以返回,符合条件2和条件3的记录可以返回。
提前谢谢, 乔治答案 0 :(得分:2)
基于给定参数动态更改搜索是一个复杂的主题,并且以一种方式对其进行操作,即使只有非常小的差异,也会产生巨大的性能影响。关键是使用索引,忽略紧凑代码,忽略担心重复代码,必须做出好的查询执行计划(使用索引)。
阅读本文并考虑所有方法。您最好的方法取决于您的参数,数据,架构和实际使用情况:
Dynamic Search Conditions in T-SQL by by Erland Sommarskog
The Curse and Blessings of Dynamic SQL by Erland Sommarskog
如果您拥有正确的SQL Server 2008版本(SQL 2008 SP1 CU5(10.0.2746)及更高版本),则可以使用此小技巧实际使用索引:
由于使用LIKE
,因此没有太多可以做的,但是如果你使用了相等,你可以在查询中添加OPTION(RECOMPILE),参见Erland的文章,SQL Server将解析OR在根据局部变量的运行时值创建查询计划之前从(Column = @Param+'%' OR @Param='') AND ...
内部开始,如果不使用LIKE
,则可以使用索引。
答案 1 :(得分:1)
如果我理解正确,以下内容应该有效:
SELECT *
FROM Books
WHERE (
((Author LIKE '%' + @p_author + '%' OR @p_author = '') OR
(Country LIKE '%' + @p_country + '%' OR @p_country = ''))
AND (@p_author <> '' OR @p_country <> '')
) AND
(Domain LIKE '%' + @p_domain + '%' OR '%' @p_domain = '')