2012-05-17 73 views
1

我有一個表books如何將變量傳遞給存儲過程的正文語句?

+-------+-----------+------------+ 
| serial| book_name | book_author| 
+-------+-----------+------------+ 
| 1  | Star Wars |  1  | 
| 2  | Java  |  2  | 
| 3  | Alimals |  3  | 
| 4  | Star Wars |  1  | 
+-------+-----------+------------+ 

我想使用存儲過程來選擇book_name;

我的存儲過程是這樣的:

USE books; 
DELIMITER // 
CREATE PROCEDURE doselect(col VARCHAR(50), tab VARCHAR(50), cond INT(5)) 
BEGIN 
    SET @x = NULL; 
    SET @col = col; 
    SET @tab = tab; 
    SET @cond = cond; 
    SET @x = (SELECT @col FROM @tab WHERE b_id = @cond); 

END // 
DELIMITER ; 

然後我把它叫做:

CALL doselect('book_name', 'books', 3) 

但ID不能正常工作。它沒有看到變量@tab。錯誤是:

書。@ tab不存在。

我也用的選擇條件這樣的變體:

SET @x = (SELECT 'col' FROM 'tab' WHERE b_id = 'cond'); 

的同樣的錯誤,但現在沒有@

books.tab不存在。

如何在這種情況下正確傳遞變量?如何讓它看到我的變量?

謝謝。

+1

我相信你必須使用動態SQL。這裏有一個例子http://stackoverflow.com/questions/190776/how-to-have-dynamic-sql-in-mysql-stored-procedure –

回答

2

用你的select和你所有的變量構造字符串,然後用Exec(string)來運行你的select。

CREATE PROCEDURE spName 
    @Var VARCHAR(50) 
AS 
    SET NOCOUNT ON; 

    DECLARE @sql VARCHAR(8000) 

    SET @sql = 'SELECT 
     X, Y + '' - '' + Z as ''Some alias'' 
FROM ' + @Var + '..TableName ' 

     exec (@sql) 
GO 
相關問題