首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql存储过程中使用表名变量

问在mysql存储过程中使用表名变量
EN

Stack Overflow用户
提问于 2010-05-03 02:09:38
回答 3查看 83.3K关注 0票数 41

我正在尝试将一个表名传到我的mysql存储过程中,以便使用这个存储过程从不同的表中选择,但它不起作用……

这就是我正在尝试的:

代码语言:javascript
复制
CREATE PROCEDURE `usp_SelectFromTables`(
 IN TableName varchar(100)
)
BEGIN
        SELECT * FROM @TableName;
END

我也试过了,没有@符号,这只是告诉我TableName不知道我知道:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-03 02:15:28

它依赖于DBMS,但这种表示法通常需要动态SQL,并且在执行时会遇到函数的返回值依赖于输入的问题。这给了系统连接。作为一般规则(因此可能会有例外),DBMS不允许对查询的结构元素(如表名或列名)使用占位符(参数);它们只允许您指定值(如列值)。

一些DBMS确实支持存储过程,这将允许您构建SQL字符串,然后使用“准备”或“立即执行”或类似操作来处理该字符串。但是,请注意,您突然很容易受到SQL注入攻击--可以执行您的过程的人就能够在一定程度上控制要执行的SQL。

票数 17
EN

Stack Overflow用户

发布于 2012-02-15 02:25:58

代码语言:javascript
复制
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;
票数 71
EN

Stack Overflow用户

发布于 2012-12-14 14:26:00

一个额外的问题给我带来了麻烦。

我希望按照@kyle的要求在查询中动态设置表名和字段,但也希望将该查询的结果存储到查询中的变量@a中。

您需要将变量@a包含在字符串文本中,而不是按字面意思将其放入concat中。

代码语言:javascript
复制
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 ;

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

') INTO @a FROM '

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

邮箱:,' WHERE ',@keyField,' >= ',@a,' ORDER BY '

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2754423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档