Sql 存储过程WHERE子句中的可选属性
我有一个应用程序,其中用户可以将我请求的部分或全部参数传递给该应用程序。(基本上,他或她可以随时停止向各种数据提供输入。)根据他们提供的输入,我想从MS SQL 2008数据库中获取信息,其中只包含他们提供给我的参数 我正在想象这样的事情,但我似乎无法让它工作,甚至不知道它是否能工作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,
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对解决此问题的各种方法及其各自的优缺点进行了明确的分析
这里的一些示例对于较小的数据集非常有用,但我强烈建议您阅读这篇文章