mySQL 使用动态列名的过程更新行
Posted
技术标签:
【中文标题】mySQL 使用动态列名的过程更新行【英文标题】:mySQL updating row with a procedure using a dynamic column name 【发布时间】:2020-06-30 04:54:10 【问题描述】:我一直在尝试编写一个存储过程,该过程涉及用户输入他们希望存储数据的列,然后输入要存储的数据。到目前为止,这可行,但该列是硬编码的。
CREATE PROCEDURE `cnp_data`.`AddBehavior` (IN StudId INT,
IN ColumnData VARCHAR(45))
BEGIN
UPDATE `Behavior`
SET `Lunch` = ColumnData
WHERE `StudentId`=StudId;
END
但我想让Lunch
列可以由用户动态设置。到目前为止,我一直坚持这一点:
CREATE PROCEDURE `cnp_data`.`AddBehavior` (IN StudId INT,
IN ColumnName VARCHAR(45),
IN ColumnData VARCHAR(45))
BEGIN
SET @Var1=StudId;
SET @Var2=ColumnName;
SET @Var3=ColumnData;
SET @sqlstm = CONCAT("UPDATE `Behavior`
SET `",@Var2,"` = ",@Var3,"
WHERE `StudentId`= ",@Var1,";");
PREPARE stmt FROM @sqlstm;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
但是当我尝试输入以下 CALL 语句时会引发错误
CALL AddBehavior(19, "AM Snack", "test");
错误代码:1054。“字段列表”中的“测试”列未知
我不明白为什么它试图将@Var3 作为列而不是将其设置为@Var2 列中的数据。
感谢大家的帮助或见解!
【问题讨论】:
尝试在 ",@Var3," 周围添加 ` 字符 非常感谢,这有效。我已经为此苦苦挣扎了太久,我不敢相信这是一个简单的报价错误。谢谢! 不客气。很高兴它修好了! 【参考方案1】:这行得通,谢谢 Anthony McGrath。
CREATE PROCEDURE `cnp_data`.`AddBehavior` (IN StudId INT,
IN ColumnName VARCHAR(45),
IN ColumnChoice VARCHAR(45))
BEGIN
SET @Var1=StudId;
SET @Var2=ColumnName;
SET @Var3=ColumnChoice;
SET @Var4=CURRENT_DATE;
SET @sqlstm = CONCAT("UPDATE `Behavior`
SET `",@Var2,"` = """,@Var3,"""
WHERE `StudentId`= ",@Var1," AND CurrentDate=""",@Var4,""";");
PREPARE stmt FROM @sqlstm;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
【讨论】:
以上是关于mySQL 使用动态列名的过程更新行的主要内容,如果未能解决你的问题,请参考以下文章