我正在尝试将常规查询构建转换为存储过程。通过“构建”查询,我不知道最好的方法。不知道怎么解释,所以我举个例子。我的例子是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))
答案 0 :(得分:0)
MySQL不支持存储过程中的动态SQL。如果你能用一份准备好的陈述,你就会好起来,但你可能想把你的逻辑分成不同的程序。
另请查看this SO question。