2008-10-10 25 views

Respuesta

42

No creo que MySQL sea compatible con SQL dinámico. Puede hacer declaraciones "preparadas" que son similares, pero diferentes.

Aquí se muestra un ejemplo:

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; 

Las declaraciones preparadas se utilizan a menudo para ver un plan de ejecución para una consulta determinada. Dado que se ejecutan con el ejecutan el comando y el sql se puede asignar a una variable, puede aproximar el mismo comportamiento que el sql dinámico.

Aquí es un buen link en esto:

No se olvide de desasignar la stmt utilizando la última línea!

¡Buena suerte!

+3

no funciona cuando el '?' Se encuentra en el lugar del nombre de la tabla –

+0

¿Estás tratando esto a través de la consola mysql? o utilizando otro método, si está usando esto en el código, su proveedor debería ser compatible. –

+1

Aparentemente, están estudiando [EXECUTE IMMEDIATE] (http://dev.mysql.com/worklog/task/?id=2793) para versiones futuras. –

91

Después 5.0.13, en los procedimientos almacenados, puede utilizar SQL dinámico:

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 dinámico no funciona en funciones o factores desencadenantes. Ver the MySQL documentation para más usos.

2

Puede pasar a través de fuera de la sentencia dinámica utilizando variables de usuario

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) 
Cuestiones relacionadas