Mysql 我的猫一直在逃跑

Mysql 我的猫一直在逃跑,mysql,Mysql,我正试图编写一个过程,但在@qr2中,当我传递子字符串_index()的参数时,CONCAT被转义 知道如何将'-'传递到函数中,而不使其脱离CONCAT函数吗 我尝试过使用“'-'”或\'-\”但没有任何效果,它总是逃避它 DELIMITER // CREATE PROCEDURE filter_bar (IN bar_state VARCHAR(20), done_state VARCHAR(20)) BEGIN set @qr1 = CONCAT('CREATE TABLE ', done

我正试图编写一个过程,但在@qr2中,当我传递子字符串_index()的参数时,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 //
您可以使用
''

您还需要一个空间:

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

DEALLOCATE smt;
=> 
DEALLOCATE PREPARE smt;


编辑:

为避免SQL注入出现问题,您应使用引号将每次出现的标识符包装起来:

给定一个字符串参数,此函数将生成一个带引号的标识符,该标识符适合包含在SQL语句中。当用作标识符的值是保留字或包含反勾(`)字符时,此选项非常有用


要记住,这会为SQL注入打开大门。这很容易导致SQL注入。
DEALLOCATE smt;
=> 
DEALLOCATE PREPARE smt;
bar_state
=>
sys.quote_identifier(bar_state)

done_state
=>
sys.quote_identifier(done_state)