使用if / else语句构建存储过程?

时间:2011-06-29 19:04:27

标签: php .net sql-server

我正在尝试将常规查询构建转换为存储过程。通过“构建”查询,我不知道最好的方法。不知道怎么解释,所以我举个例子。我的例子是PHP,但概念在任何语言中都是一样的。例子应该足够简单。

if($somevar){
    $w .= " AND SomeVar = '$somevar' ";
}
if($anothervar){
    $w .= " AND AnotherVar = '$anothervar' ";
}

$sql = "SELECT * FROM MyTable WHERE Title = 'test' " . $w;

所以基本上如果这两个都有值,那么SQL将是:

SELECT * FROM MyTable WHERE Title = 'test' AND SomeVar = 'blah' AND 
AnotherVar = 'blah'

因为此查询有四种可能的变体,使用存储过程“构建”此查询的最佳方法是什么?

继承其他三种可能性:

SELECT * FROM MyTable WHERE Title = 'test' AND AnotherVar = 'blah'
SELECT * FROM MyTable WHERE Title = 'test' AND SomeVar = 'blah'
SELECT * FROM MyTable WHERE Title = 'test'

我是否通过BIND将两个变量传递给SP,然后在SP中传递IF / ELSE语句。

如果是这样,有人可以向我提供一个如何在SP中执行此操作的示例吗?

或者,还有其他方法可以解决这个问题吗?

谢谢!

编辑:MySQL将从常规查询转换为MSSQL到存储过程

编辑2:

基于Joe Stefanelli的评论,我认为这是我的问题的答案,任何想法?

CREATE PROCEDURE testSP
    @somevar varchar(50),
    @anothervar varchar(50)
AS
    SELECT * FROM MyTable WHERE Title = @title
    AND ((SomeVar = @somevar AND @somevar IS NOT NULL) OR (@somevar IS NULL))
    AND ((AnotherVar = @anothervar AND @anothervar IS NOT NULL) OR (@anothervar IS NULL))

1 个答案:

答案 0 :(得分:0)

MySQL不支持存储过程中的动态SQL。如果你能用一份准备好的陈述,你就会好起来,但你可能想把你的逻辑分成不同的程序。

另请查看this SO question