usar uma variável para o nome da tabela no mysql sproc

Eu estou tentando passar um nome de tabela em meu procedimento armazenado mysql para usar este sproc para selecionar fora de tabelas diferentes, mas não está funcionando …

isso é o que eu estou tentando:

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

Eu também tentei w / o sinal @ e isso só me diz que TableName não existe … o que eu sei 🙂

Depende do SGBD, mas a notação geralmente requer SQL Dinâmico, e corre para o problema de que os valores de retorno da function dependem das inputs quando ela é executada. Isso dá as conotações do sistema. Como regra geral (e, portanto, provavelmente sujeito a exceções), o DBMS não permite o uso de espaços reservados (parâmetros) para elementos estruturais de uma consulta, como nomes de tabelas ou de colunas; eles só permitem que você especifique valores como valores de coluna.

Alguns DBMS têm suporte a stored procedures que lhe permitirá construir uma string SQL e depois trabalhar com isso, usando ‘prepare’ ou ‘execute immediate’ ou operações similares. Observe, no entanto, que você está subitamente vulnerável a ataques de injeção de SQL – alguém que pode executar seu procedimento é capaz de controlar, em parte, qual SQL é executada.

 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; 

Um pouco mais que me causou problemas.

Eu queria definir o nome da tabela e campo dinamicamente em uma consulta como @kyle perguntou, mas eu também queria armazenar o resultado dessa consulta em uma variável @a dentro da consulta.

Em vez de colocar a variável @a na concat literalmente, você precisa incluí-la como parte do texto da string.

 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 ; 

Então, em @sql_text1 atribua o resultado da consulta a @a dentro da string usando:

') INTO @a FROM '

Em seguida, em @sql_text2 use @a como uma variável real:

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