我有三个不同的ERP的三个存储过程,几乎完全相同的操作,所以我决定只做一个,并使用参数。一些字段名称根据参数而改变,所以我将它们设置为变量。然后我使用准备好的语句使其工作。使用准备好的语句和变量的SQL语法错误
不使用预处理语句的工作更新如下:
update lt_erp_barcodes
set barcode_list = concat(',', curr_barcode, barcode_list)
where cod_navision = curr_erp_code;
它更新当前barcode_list在列表的beggining添加curr_barcode,并且还加入了逗号。 (,curr_barcode,该列表的其余部分)
我的做法,使其与事先准备好的声明的工作是:
set @erp_code_field_name = "cod_navision";
set @curr_erp_code = '12345';
set @curr_barcode = '123123123';
set @q1 = concat('update lt_erp_barcodes
set barcode_list = (\',\'', @curr_barcode, ' barcode_list)
where ', @erp_code_field_name, ' = ', @curr_erp_code);
prepare update_barcode_list from @q1;
execute update_barcode_list;
但是,当我打电话给prepare
引发以下错误:
0 228 10:30:17从@ q1准备update_barcode_list错误代码:1064.您的SQL语法有错误;检查对应于你的MySQL服务器版本使用附近的正确语法手册“123123123 barcode_list 其中cod_navision = 12345”在2号线0.047秒
我怎么可能使代码工作的第二块一样第一个? 感谢
您能打印生成的sql语句吗? – mcalex
其实你可以在字符串周围使用双引号而不是单引号,如果你需要它有单引号即concat(“'”,@ variable,“'”);类似的东西。 – Learning
我认为你对准备语句应该如何工作(以及它们如何保护你免受SQL注入)有点困惑。最后,你试图这样做的方式意味着你没有添加任何保护。您仍然只是将SQL查询连接在一起。 – Phylogenesis