Sql 带有11+;动态参数

Sql 带有11+;动态参数,sql,sql-server,windows-server-2008,dynamic-sql,Sql,Sql Server,Windows Server 2008,Dynamic Sql,我知道这个问题以前曾被提出和辩论过。我读到的答案大多是观点,所以我在寻找更专业的答案。更多“引擎盖下” 我正在使用SQLServer2008。我将要编写一个查询,它需要接受至少11个输入。用户可以指定其中的1到11(+)。它们有各种类型(ID、文本匹配、地理位置、全文匹配、记录集等)。它是SQL所能提供的最动态的 我知道如何在不使用动态SQL的情况下执行此操作: /*for simple match*/ WHERE @Input IS NOT NULL OR t.col = @Input 由于

我知道这个问题以前曾被提出和辩论过。我读到的答案大多是观点,所以我在寻找更专业的答案。更多“引擎盖下”

我正在使用SQLServer2008。我将要编写一个查询,它需要接受至少11个输入。用户可以指定其中的1到11(+)。它们有各种类型(ID、文本匹配、地理位置、全文匹配、记录集等)。它是SQL所能提供的最动态的

我知道如何在不使用动态SQL的情况下执行此操作:

/*for simple match*/ WHERE @Input IS NOT NULL OR t.col = @Input
由于连接等原因,这有缺点。我从不使用动态SQL。但从我所读到的内容来看,这似乎是动态SQL的一个例子

谁能给我一些技术指导吗?

看看动态SQl的祸福和动态搜索条件链接


看看动态SQl的祸福和动态搜索条件链接

你需要记住,如果你不想使用动态SQl(我也不会这么做),那么枯燥的原则就有点过时了

有效地利用TVP并接受这样一个事实,即您将具有较高的圈复杂度(对于SQL语句)

如果你想让所有的东西都能缓存,那么你应该考虑如何在多个过程中设计它,然后根据需要分解你的条件。

另一种非常常见的方法是包括以下条件:

WHERE (@pParam IS NULL OR ~condition~)
如果您的参数为NULL,那么SQL将不会麻烦解决条件的另一半。
编辑:最后一部分仅适用于SQL2008R2,并且仅当使用
选项(重新编译)
命令时,您需要记住,如果您不想使用动态SQL(我也不想),那么DRY原则是不存在的

有效地利用TVP并接受这样一个事实,即您将具有较高的圈复杂度(对于SQL语句)

如果你想让所有的东西都能缓存,那么你应该考虑如何在多个过程中设计它,然后根据需要分解你的条件。

另一种非常常见的方法是包括以下条件:

WHERE (@pParam IS NULL OR ~condition~)
如果您的参数为NULL,那么SQL将不会麻烦解决条件的另一半。
编辑:最后一部分仅适用于SQL2008R2,并且仅当使用
选项(重新编译)
命令时才适用。有关此主题的详细检查,请参阅。有关此主题的详细检查,请参阅。您的最后一行完全不正确。这种做法会使潜在的可查找的搜索谓词无法组织,并导致不必要的表扫描。@Martin,我遗漏了关于使用
选项(重新编译)
的重要部分,但这种做法直接来自于发布的链接中的Erland Sommarskog。这是一个非常重要的部分需要省略!顺便说一句,这实际上是SQL Server 2008 SP1 CU5及以上版本,而不仅仅是R2。您的最后一行完全不正确。这种做法会使潜在的可查找的搜索谓词无法组织,并导致不必要的表扫描。@Martin,我遗漏了关于使用
选项(重新编译)
的重要部分,但这种做法直接来自于发布的链接中的Erland Sommarskog。这是一个非常重要的部分需要省略!顺便说一句,这实际上是SQL Server 2008 SP1 CU5及以上版本,而不仅仅是R2。