mysql CONCAT不断转义

时间:2018-09-08 18:20:04

标签: mysql

我正在尝试编写一个过程,但是当我为substring_index()传递arg时,在我的@ qr2中,CONCAT逃脱了。

有什么想法可以在不使CONCAT函数转义的情况下将'-'传递给函数吗?

我尝试使用“'-'”或\'-\',但没有任何效果,它一直在转义。

DELIMITER //
CREATE PROCEDURE filter_bar (IN bar_state VARCHAR(20), done_state VARCHAR(20))
BEGIN
set @qr1 = CONCAT('CREATE TABLE ', done_state, ' like ', bar_state, ';');
PREPARE smt from @qr1;
EXECUTE smt;
DEALLOCATE smt;

set @qr2 = CONCAT('UPDATE ', bar_state, ' SET date = SUBSTRING_INDEX(date,'-',-1);');
PREPARE smt from @qr2;
EXECUTE smt;
DEALLOCATE smt;

set @qr3 = CONCAT('INSERT into', done_state,'select name, business_id, date, sum(count) as count from', bar_state,' group by name, business_id, date;');
PREPARE smt from @qr3;
EXECUTE smt;
END //

1 个答案:

答案 0 :(得分:0)

您可以使用''

set @qr2=CONCAT('UPDATE ',bar_state,' SET date=SUBSTRING_INDEX(date,''-'',-1);');

您还需要一个空格:

set @qr3 = CONCAT('INSERT into', done_state,' select name, business_id, date, ...'
                                             -- here

最后:

DEALLOCATE smt;
=> 
DEALLOCATE PREPARE smt;

DBFiddle Demo


编辑:

为避免SQL注入问题,您应该在每次出现标识符时都用引号引起来:

  

The quote_identifier() Function

     

给出一个字符串参数,该函数产生一个带引号的标识符,适合包含在SQL语句中。当用作标识符的值是保留字或包含反引号(`)字符时,此功能很有用。

bar_state
=>
sys.quote_identifier(bar_state)

done_state
=>
sys.quote_identifier(done_state)
相关问题