2011-06-29 74 views
0

我試圖將常規查詢構建轉換爲存儲過程。我不知道通過「構建」查詢來解決這個問題的最佳方式。不知道如何解釋,所以我會舉一個例子。我的例子是在PHP中,但任何語言的概念都是一樣的。例子應該足夠簡單。用if/else語句構建存儲過程?

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:

根據喬·斯特凡內利的評論,我認爲這是回答我的問題,有什麼想法?

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)) 
+4

對於SQL Server,請參閱Gail Shaw在[Catch-all queries]上的博文(http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) –

+0

了不起的信息, 謝謝! – tcarter2005

+0

(IS NOT NULL)OR(IS NULL)的問題在於它在性能上是殺手級的。 –

回答

0

MySQL在存儲過程中不支持動態SQL。如果你能準備好一份準備好的陳述,那麼你很有可能會去,但除此之外,你可能想要將你的邏輯分解成單獨的程序。

也看看this SO question

+0

是的,對不起,我想我應該說...這將是爲MSSQL – tcarter2005

+1

@ tcarter2005:如果你的意思*'爲MSSQL **只**',那麼你可能應該從你的帖子中刪除'mysql'標記。 –