我有一个应用程序,用户可以在其中传递我正在向应用程序请求的部分或全部参数。 (基本上,他或她可以随时停止为各种数据提供输入。)根据他们提供的输入,我想从MS SQL 2008数据库中获取信息,只包含他们给我的参数。 / p>
我正在想象这样的事情,但我似乎无法让它发挥作用,也不知道它是否可以。
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
显然,这不是有效的代码,但它给出了一般的想法。我希望能够将变量用作WHERE子句的一部分,但前提是它不使用幻数(在本例中为0)。
我不熟悉SQL的功能,不知道我想做什么是可能的。到目前为止,我所尝试的一切都失败了。如果我在这里完全走错了路,我会欣赏指向正确方向的指针。
答案 0 :(得分:0)
这是一种方法......
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 )
答案 1 :(得分:0)
一种方式:
WHERE ( (@Input1 = 0) OR (@Input1 BETWEEN LowValue AND HighValue) )
AND ( (@Input2 = 0) OR (@Input2 BETWEEN LowValue AND HighValue) )
AND ( (@Input3 = 0) OR (@Input3 < HighValue) )
如果您希望@InputX = 0
可用于第二次检查,您还可以将这些@InputX IS NULL
条件更改为0
。
答案 2 :(得分:0)
信息系统中非常常见的要求是具有一个或多个功能,其中用户能够通过在许多可能的标准中自由选择来搜索数据。这是一项艰巨的挑战,因为您不仅必须产生所需的输出,而且还必须将响应时间保持在可接受的范围内,至少对于常见搜索而言。最重要的是,代码必须是可维护的,以便您可以轻松修改它以满足新的需求和要求。
有两种方法可以解决此问题:动态SQL和静态SQL。在SQL 2005之前,很难找到易于编写和维护但性能良好的静态SQL解决方案,建议使用动态SQL。在SQL 2008中,事情发生了变化。 Microsoft更改了提示OPTION(RECOMPILE),因此它现在可以正常工作。但是,原始实现中存在严重错误,您至少需要CU5的SQL 2008 SP1或SQL 2008 SP2才能从此功能中受益。
Erland Sommarskog对这个问题的各种方法及其各自的优缺点进行了明确的分析。
http://www.sommarskog.se/dyn-search-2008.html
此处的一些示例适用于较小的数据集,但我强烈建议您查看该文章。