我有三個不同的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