2008-10-10 91 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) 
相关问题