Sql 存储过程WHERE子句中的可选属性

Sql 存储过程WHERE子句中的可选属性,sql,sql-server-2008,stored-procedures,Sql,Sql Server 2008,Stored Procedures,我有一个应用程序,其中用户可以将我请求的部分或全部参数传递给该应用程序。(基本上,他或她可以随时停止向各种数据提供输入。)根据他们提供的输入,我想从MS SQL 2008数据库中获取信息,其中只包含他们提供给我的参数 我正在想象这样的事情,但我似乎无法让它工作,甚至不知道它是否能工作 CREATE PROCEDURE [dbo].[SearchForSolution] @Input1 int = 0, @Input2 int = 0, @Input3 int = 0,

我有一个应用程序,其中用户可以将我请求的部分或全部参数传递给该应用程序。(基本上,他或她可以随时停止向各种数据提供输入。)根据他们提供的输入,我想从MS SQL 2008数据库中获取信息,其中只包含他们提供给我的参数

我正在想象这样的事情,但我似乎无法让它工作,甚至不知道它是否能工作

CREATE PROCEDURE [dbo].[SearchForSolution]
    @Input1 int = 0, 
    @Input2 int = 0,
    @Input3 int = 0,
AS
SELECT Name, SolutionValue
FROM MyTable
WHERE (IF @Input1 != 0) { BETWEEN LowValue AND HighValue }
      AND (IF @Input2 != 0) { BETWEEN LowValue AND HighValue }
      AND (IF @Input3 != 0) { < HighValue }         
RETURN 0
创建过程[dbo]。[SearchForSolution]
@Input1 int=0,
@输入2 int=0,
@输入3 int=0,
像
选择名称,SolutionValue
从MyTable
其中(如果@Input1!=0){介于LowValue和HighValue之间}
和(如果@Input2!=0){介于低值和高值之间}
和(如果@Input3!=0){
显然,这不是有效的代码,但它给出了总体思路。我希望能够使用变量作为WHERE子句的一部分,但前提是它不使用幻数(在本例中,幻数为0)

我不太熟悉这里SQL的功能,也不确定我想做的事情是否可行。到目前为止,我所尝试的一切都失败了。如果我在这里完全走错了路,我希望有一个指向正确方向的指针。

这里有一个方法

 SELECT 
     Name, 
     SolutionValue
 FROM 
     MyTable
WHERE
     //Compact syntax simple for optional equals filter
     FIELD1  = ISNULL(@Input1,FIELD1) 
     //intention clearer and let's you do more than equals      
     AND ( @Input2 IS NULL OR FIELD2 > @Input2 ) 
     //can be extended for Between... 
     AND ((@Input3 IS NULL or  @Input4 IS NULL)   OR  FIELD3 BETWEEN  @Input3 AND @Input4 )
单向:

WHERE ( (@Input1 = 0) OR (@Input1 BETWEEN LowValue AND HighValue) )
  AND ( (@Input2 = 0) OR (@Input2 BETWEEN LowValue AND HighValue) ) 
  AND ( (@Input3 = 0) OR (@Input3 < HighValue) )
其中(@Input1=0)或(@Input1介于低值和高值之间))
和(@Input2=0)或(@Input2介于低值和高值之间))
和(@Input3=0)或(@Input3
如果希望
0
在第二次检查中可用,还可以将这些
@InputX=0
条件更改为
@InputX为NULL

信息系统中一个非常常见的要求是具有一个或多个功能,用户可以通过在许多可能的标准中自由选择来搜索数据。这是一个艰巨的挑战,因为您不仅必须生成所需的输出,而且还必须将响应时间保持在可接受的范围内,至少对于常见的搜索是如此。最重要的是,代码必须是可维护的,这样您就可以轻松地修改它以满足新的需求

有两种方法可以解决这个问题:动态SQL和静态SQL。到SQL2005为止,很难找到编写和维护简单但性能良好的静态SQL解决方案,建议使用动态SQL。在SQL 2008中,情况发生了变化。Microsoft更改了提示选项(重新编译),因此它现在可以像您预期的那样工作。然而,在最初的实现中有一个严重的错误,您至少需要SQL 2008 SP1或SQL 2008 SP2的CU5才能从该功能中获益

Erland Sommarskog对解决此问题的各种方法及其各自的优缺点进行了明确的分析

这里的一些示例对于较小的数据集非常有用,但我强烈建议您阅读这篇文章