在存储过程中调用列名

时间:2012-02-14 17:52:20

标签: mysql

作为存储过程,这应该是相当容易的,但它不是那样的。两个输入:cname(概念名称,概念表)和vname(变量或列名称,评级表)。 cname输入效果很好但是当我输入vname时,我得到的只是输入文本。

所以,如果我“调用enc2.sptest('jello','dwb');”我会用“jello”(cname)这个词取回所有内容,但我不会回到“dwb”(vname)列中的值。 MySQL可以接受列名输入吗?是否有解决方法?

drop procedure if exists enc2.sptest;
delimiter $$
create procedure enc2.sptest (in cname varchar(1000),in vname text)
begin
select
a.concept_id
,a.concept_name
,b.vname 
from enc2.concept a,enc2.ratings b
where a.concept_name like concat('%',cname,'%')
and vname is not null
and a.concept_id=b.concept_id
order by vname asc;
end

1 个答案:

答案 0 :(得分:0)

如果有人想知道答案,我相信你需要手动创建查询并从准备好的语句中执行它,如下所示。

drop procedure if exists enc2.sptest;
delimiter $$
create procedure enc2.sptest (in cname varchar(1000),in vname text)
begin
    set @query = CONCAT(' ',
    ' select ',
    ' a.concept_id ',
    ' ,a.concept_name ',
    ' ,b.`' , vname , '`  ',
    ' from concept a,ratings b ',
    ' where a.concept_name like ? ',
    ' and `', vname , '` is not null ',
    ' and a.concept_id=b.concept_id ',
    ' order by `', vname, '` asc; ',
    ' ');
    -- select @query;
    set @cname = concat('%',cname,'%');
    prepare statement from @query;
    execute statement using @cname;
    deallocate prepare statement;
end
$$

执行此操作时需要注意的事项,例如SQL注入攻击和带空格的列名。

  • 如果在SQL查询中使用参数(在语句中由“?”表示,并且在执行语句时由参数提供值),则可以防止SQL注入攻击。

  • 可以使用反引号“

  • 处理带空格的字段名称