2010-06-04 91 views
17

舉例來說,這不起作用:在MySQL中:如何將表名稱作爲存儲過程和/或函數參數傳遞?

DELIMITER // 
CREATE PROCEDURE countRows(tbl_name VARCHAR(40)) 
    BEGIN 
    SELECT COUNT(*) as ct FROM tbl_name; 
    END // 

DELIMITER ; 
CALL countRows('my_table_name'); 

產地:

ERROR 1146 (42S02): Table 'test.tbl_name' doesn't exist 

然而,這種按預期工作:

SELECT COUNT(*) as ct FROM my_table_name; 

什麼語法要求使用的參數作爲選擇語句中的表名?這甚至有可能嗎?

+1

即使這是可能的,這不是一個你應該下去的路徑。或者用你真正想要的sql來構建s'procs,或者直接在你的代碼中嵌入ad hoc sql。 – NotMe 2010-06-04 20:00:18

+3

@Chris你可以在這裏看到意圖和力量,對吧?將一個表名稱傳遞給一個通用函數。我認爲它是完全合法和需要的。幫助我理解爲什麼從sproc控制結果集不好?從你的意思,如果我有一個.NET開發人員和一個PHP開發人員,我應該讓他們寫出他們自己的代碼來獲得相同的結果集? – 2010-06-04 20:07:03

+0

我看到了這個意圖,它有缺陷。我強烈建議你閱讀以下內容:http://www.sommarskog.se/dynamic_sql.html雖然它涵蓋了ms sql server,但課程是相同的。 – NotMe 2010-06-07 01:45:03

回答

24

Prepared statements是你需要的。

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40)) 
BEGIN 
SET @t1 =CONCAT('SELECT * FROM ',tab_name); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
END $$ 
+0

+1:你是第一個,&正確的 - 你必須使用Prepared Statements(MySQL的動態SQL):http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html – 2010-06-04 20:05:30

+0

真棒。太感謝了。 – 2010-06-04 20:16:31

+2

'調用GetNumRows(gps_location)' 返回: '#1054 - '字段列表'中的未知列'gps_location' – Pachonk 2014-03-24 06:55:17

相關問題