mySQL обновление строки с помощью процедуры с использованием динамического c имени столбца - PullRequest
0 голосов
/ 19 марта 2020

Я пытался написать хранимую процедуру, в которой пользователь вводит в столбец, в котором он sh, данные для хранения, а затем данные для хранения. Пока это работает, но столбец жестко запрограммирован.

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. Неизвестный столбец 'test' в 'списке полей'

Я не понимаю, почему он пытается найти @ Var3 в качестве столбца, а не устанавливать его в качестве данных внутри столбца @ Var2.

Спасибо всем за помощь или советы!

1 Ответ

0 голосов
/ 19 марта 2020

Это работает, спасибо Энтони МакГрат.

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
...