在mysql sproc中使用表名的变量

Kyl*_*yle 29 mysql stored-procedures query-parameters

我正在尝试将表名传递给我的mysql存储过程以使用此sproc来选择不同的表,但它不起作用...

这就是我想要的:

CREATE PROCEDURE `usp_SelectFromTables`(
 IN TableName varchar(100)
)
BEGIN
        SELECT * FROM @TableName;
END
Run Code Online (Sandbox Code Playgroud)

我也尝试了没有@符号,只是告诉我TableName不存在...我知道:)

小智 58

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;
Run Code Online (Sandbox Code Playgroud)

  • 这是如何回答这个问题的?OP询问如何将表名作为变量传递到存储过程中!!! (6认同)

cod*_*gle 14

额外的一点让我有问题.

我希望在查询中动态设置表名和字段,如@kyle所说,但我也希望将该查询的结果存储到查询中的变量@a中.

您需要将其作为字符串文本的一部分包含在内,而不是将变量@a放入concat字面上.

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 ;
Run Code Online (Sandbox Code Playgroud)

因此,使用以下命令@sql_text1将查询结果分配到@a字符串中:

') INTO @a FROM '

然后,在@sql_text2使用@a作为实际变量:

,' WHERE ',@keyField,' >= ',@一个,' ORDER BY '


Jon*_*ler 13

它取决于DBMS,但符号通常需要动态SQL,并且遇到函数的返回值在执行时依赖于输入的问题.这给系统带来了条件.作为一般规则(因此可能受到例外限制),DBMS不允许您对查询的结构元素(如表名或列名)使用占位符(参数); 它们只允许您指定列值等值.

某些DBMS确实具有存储过程支持,允许您构建SQL字符串,然后使用"prepare"或"execute immediate"或类似操作来处理它.但请注意,您突然容易受到SQL注入攻击 - 可以执行您的过程的人可以部分控制SQL执行的内容.