usar una variable para el nombre de la tabla en mysql sproc

Estoy tratando de pasar un nombre de tabla a mi procedimiento almacenado mysql para usar este sproc para seleccionar fuera de tablas diferentes pero no está funcionando …

esto es lo que estoy intentando:

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

También lo probé sin el signo @ y eso me dice que TableName no existe … lo cual sé 🙂

Depende del DBMS, pero la notación generalmente requiere SQL dynamic y se encuentra con el problema de que los valores de retorno de la función dependen 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.

 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; 

Un poco más que me causó problemas.

Quería establecer dinámicamente el nombre y el campo de la tabla en una consulta como lo pidió @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 en el concat literalmente, necesita incluirlo 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 ; 

Entonces en @sql_text1 asigna el resultado de la consulta a @a dentro de la cadena usando:

') INTO @a FROM '

Luego en @sql_text2 use @a como una variable real:

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