2011-09-12 34 views
9

在執行順序執行的sql腳本中,有沒有一種方法可以引入IF THEN ELSE條件來控制查詢執行的流程?如果在SQL腳本中使用Mysql

我碰巧碰到這個http://www.bennadel.com/blog/1340-MySQL-Does-Not-Support-IF-ELSE-Statements-In-General-SQL-Work-Flow.htm 它說IF THEN ELSE不能在sql腳本中工作。

是否有其他解決方法?

基本上,我想運行一個特定的「從表中選擇colName」命令,並檢查colName是否對應一個特定的值。如果是這樣,繼續處理腳本的其餘部分。否則,停止執行。

請指教。

+0

從提供的鏈接:「他們只允許在函數和存儲過程。」 – user470714

+0

您可以將腳本放入存儲過程,然後調用該過程。 – Owen

+0

工會怎麼樣? – ajreal

回答

16

我只是將我的SQL腳本包裝在允許條件代碼的過程中。如果你不想留下陳述,你可以在完成後放棄程序。這裏有一個例子:

delimiter // 

create procedure insert_games() 

begin 

    set @platform_id := (select id from platform where name = 'Nintendo DS'); 

    -- Only insert rows if the platform was found 
    if @platform_id is not null then 

     insert into game(name, platform_id) values('New Super Mario Bros', @platform_id); 
     insert into game(name, platform_id) values('Mario Kart DS', @platform_id); 

    end if; 

end; 

// 

delimiter ; 

-- Execute the procedure 
call insert_games(); 

-- Drop the procedure 
drop procedure insert_games; 

如果你還沒有使用的程序,在「分隔符」關鍵字可能需要一些解釋。第一行將分隔符切換爲「//」,以便我們可以在我們的過程定義中包含分號,而MySQL不會試圖解釋它們。一旦程序創建完畢,我們將分隔符切換回「;」所以我們可以照常執行語句。

0

經過一番研究,我想我可能已經找到了解決這個問題的方法。我正在尋找一種方法來驗證腳本是否已經針對目標數據庫執行。這將主要用於我的數據庫的版本控制。我創建了一個表來跟蹤已經執行的腳本,並希望腳本中的某些流程在執行前先檢查該表。雖然我還沒有完全解決這個問題,但我已經創建了一個簡單的腳本,它基本上可以滿足我需要,我只需要根據變量的值將DDL包裝到選擇中。

第1步 - 設置一個位變量來保存結果 第2步 - 做你的選擇並設置變量如果結果發現 第3步 - 你需要在假的結果做什麼 第4步 - 做什麼你需要在真正的結果

這裏做的是示例腳本

集@schemachangeid = 0;

從SchemaChangeLog中選擇@schemachangeid:= 1其中scriptname ='1_create_tables.sql';

從雙重選擇'scriptalreadyran'其中@schemachangeid = 1;

從雙重選擇'scriptnotran'其中@schemachangeid = 0;

我也認識到這是一個古老的線程,但也許這會幫助有人試圖做這樣的事情在像我這樣的存儲過程之外。