2010-05-02 19 views
23

Estoy tratando de pasar un nombre de tabla en MySQL mi procedimiento almacenado para utilizar este procedimiento almacenado para seleccionar fuera de las diferentes mesas pero no está funcionando ...utilizar una variable de nombre de tabla en MySQL sproc

esto es lo I "m tratando:

CREATE PROCEDURE `usp_SelectFromTables`(
IN TableName varchar(100) 
) 
BEGIN 
     SELECT * FROM @TableName; 
END 

también he intentado w/o el signo @ y que simplemente me dice que NombreTabla no existe ... que sé :)

Respuesta

12

depende el DBMS, pero la notación generalmente requiere SQL dinámico, y se ejecuta en el problema de que los valores de retorno de la f la unción depende de las entradas cuando se ejecuta. Esto le da a las connipciones del sistema. Como regla general (y, por lo tanto, probablemente sujeto a excepciones), DBMS no le permite utilizar marcadores de posición (parámetros) para elementos estructurales de una consulta, como nombres de tabla o columna; solo le permiten especificar valores tales como valores de columna.

Algunos DBMS tienen soporte de procedimientos almacenados que le permitirá construir una cadena SQL y luego trabajar con eso, usando 'preparar' o 'ejecutar inmediatamente' o operaciones similares. Sin embargo, tenga en cuenta que, de repente, es vulnerable a los ataques de inyección de SQL: alguien que puede ejecutar su procedimiento puede controlar, en parte, qué SQL se ejecuta.

44
SET @cname:='jello'; 
SET @vname:='dwb'; 
SET @sql_text = concat('select concept_id,concept_name,',@vname,' from enc2.concept a JOIN enc2.ratings b USING(concept_id) where concept_name like (''%',@cname,'%'') and 3 is not null order by 3 asc'); 

PREPARE stmt FROM @sql_text; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

WOW, qué bril ¡manera ligera! –

12

Un poco más que me causó problemas.

Quería establecer el nombre y el campo de la tabla dinámicamente en una consulta como @kyle, pero también quería almacenar el resultado de esa consulta en una variable @a dentro de la consulta.

En lugar de poner la variable @a literalmente en el concat, debe incluirla como parte del texto de cadena.

delimiter // 

CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT) 

BEGIN 
    SET @table_name = table_name; 
    SET @keyField = keyField; 
    SET @maxId = maxId; 
    SET @num_rows = num_rows; 

    SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name); 
    PREPARE stmt1 FROM @sql_text1; 
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1; 

    loop_label: LOOP 
    SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1'); 
    PREPARE stmt2 FROM @sql_text2; 
    EXECUTE stmt2; 
    DEALLOCATE PREPARE stmt2; 

    ...Additional looping code... 

    END LOOP; 
END 
// 

delimiter ; 

Así que en @sql_text1 asignar el resultado de la consulta a @a dentro de la cadena usando:

') INTO @a FROM '

Luego, en @sql_text2 uso @a como una variable real:

,' WHERE ',@keyField,' >= ', @ un ,' ORDER BY '

Cuestiones relacionadas