我正在尝试编写一个过程,但是当我为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 //
答案 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;
编辑:
为避免SQL注入问题,您应该在每次出现标识符时都用引号引起来:
The quote_identifier() Function
给出一个字符串参数,该函数产生一个带引号的标识符,适合包含在SQL语句中。当用作标识符的值是保留字或包含反引号(`)字符时,此功能很有用。
bar_state
=>
sys.quote_identifier(bar_state)
done_state
=>
sys.quote_identifier(done_state)