我知道这个问题之前已被提出并进行过辩论。我读过的答案主要是意见,所以我正在寻找更具技术性的东西。更多“引擎盖下”。
我正在使用SQL Server 2008.我即将编写一个需要接受至少11个输入的查询。用户可以指定1到11(+)这些。它们有各种类型(ID,文本匹配,地理,全文匹配,记录集等)。它与SQL一样动态。
我知道如何在不使用动态SQL的情况下执行此操作:
/*for simple match*/ WHERE @Input IS NOT NULL OR t.col = @Input
由于连接等原因,这有缺点我不会使用动态SQL。但是根据我的阅读,似乎这可能是动态SQL的一种情况。
有人可以提供一些技术指标吗?
答案 0 :(得分:3)
http://www.sommarskog.se/index.html
查看Dynamic SQl和动态搜索条件链接的诅咒和祝福
答案 1 :(得分:1)
你需要记住,如果你不想使用动态SQL(我也不想),那么DRY原则就是在窗外进行排序。
有效利用TVP并接受这样一个事实,即你的圈复杂度会有些高(对于SQL语句)
如果您希望所有内容都可以缓存和搜索,您应该考虑如何在多个过程中设计它,然后根据需要打破您的条件。
另一种非常常见的方法是包括以下条件:
WHERE (@pParam IS NULL OR ~condition~)
如果您的参数为NULL,则SQL不会打扰解决条件的另一半。
编辑:最后一部分仅适用于SQL2008R2,并且仅在使用OPTION(RECOMPILE)
命令