2008-10-10 178 views

回答

42

我不相信MySQL支持動態sql。您可以執行類似但「不同」的「準備好」陳述。

下面是一個例子:

mysql> PREPARE stmt FROM 
    -> 'select count(*) 
    -> from information_schema.schemata 
    -> where schema_name = ? or schema_name = ?' 
; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 
mysql> EXECUTE stmt 
    -> USING @schema1,@schema2 
+----------+ 
| count(*) | 
+----------+ 
|  2 | 
+----------+ 
1 row in set (0.00 sec) 
mysql> DEALLOCATE PREPARE stmt; 

的準備的語句通常用於看到執行計劃對於給定的查詢。由於它們是通過執行執行命令和sql可以分配給一個變量,您可以近似與動態sql的一些行爲。

這裏是關於一個很好的link

不要忘記使用最後一行解除分配stmt

祝你好運!

+3

它不工作通通過動態語句外,當`?`是在表名 – 2010-01-11 19:50:04

91

5.0.13後,在存儲過程中,你可以使用動態SQL:

delimiter // 
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64)) 
BEGIN 
    SET @s = CONCAT('SELECT ',col,' FROM ',tbl); 
    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END 
// 
delimiter ; 

動態SQL不函數或觸發器工作。更多用途見the MySQL documentation

2

您可以使用用戶定義的變量

Server version: 5.6.25-log MySQL Community Server (GPL) 

mysql> PREPARE stmt FROM 'select "AAAA" into @a'; 
Query OK, 0 rows affected (0.01 sec) 
Statement prepared 

mysql> EXECUTE stmt; 
Query OK, 1 row affected (0.01 sec) 

DEALLOCATE prepare stmt; 
Query OK, 0 rows affected (0.01 sec) 

mysql> select @a; 
+------+ 
| @a | 
+------+ 
|AAAA | 
+------+ 
1 row in set (0.01 sec) 
相關問題