sql 触发器在将列名存储在变量中并将其用于 sql 触发器中的 OLD.myvar 时出现错误

Posted

技术标签:

【中文标题】sql 触发器在将列名存储在变量中并将其用于 sql 触发器中的 OLD.myvar 时出现错误【英文标题】:sql triggers I have error while storing column name in variable and use it for OLD.myvar in sql triggers 【发布时间】:2018-03-27 06:39:13 【问题描述】:

mysql 说:#1054 - 'OLD' 中的未知列 'TMPCOL'

BEGIN
DECLARE TOTAL,I INT;
DECLARE CURRENT_CLOUMN VARCHAR(255);
DECLARE TRIGGER_ON_TABLE VARCHAR(255);
DECLARE TRIGGER_OP VARCHAR(255);
DECLARE olddd VARCHAR(255);
DECLARE newwww VARCHAR(255);
SET TOTAL=0;
SET I=0;
SET CURRENT_CLOUMN='atulbaldaniya.com';
SET TRIGGER_ON_TABLE='atulbaldaniya';
SET TRIGGER_OP='UPDATE';
SET olddd='';
SET newwww='';

SELECT COUNT(COLUMN_NAME) INTO  TOTAL  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = TRIGGER_ON_TABLE ORDER BY ORDINAL_POSITION;
    WHILE I < TOTAL DO
        SELECT COLUMN_NAME INTO CURRENT_CLOUMN FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = TRIGGER_ON_TABLE ORDER BY ORDINAL_POSITION LIMIT I,1;
        SET olddd=OLD.CURRENT_CLOUMN;
        SET newwww=NEW.CURRENT_CLOUMN;
            IF(olddd != newwww) THEN
                INSERT INTO TMP(DATA1, DATA2)VALUES(TOTAL ,CONCAT('Change in ',olddd,' To ',newwww))
            END IF; 
        SET I=I+1;
    END WHILE ;
END

我不想INSERT INTO TMP(DATA1, DATA2)VALUES(TOTAL ,OLD.ID); 这工作正常。

我想将列名存储在一个变量中并使用 OLD.MYVAR

我们怎么能这样呢?

【问题讨论】:

您必须将 SQL 语句构建为字符串,然后准备并执行它。 谢谢,Sagar 你能给我一个查询的例子吗?使用 tmp 变量,我可以更改列名 @AtulBaldaniya 正如 Sloan 所说,您可以使用字符串连接准备语句,然后继续。 【参考方案1】:

您可以将查询构建为字符串,然后准备并执行它,类似于:

SET @s = CONCAT('INSERT INTO TMP(DATA1, DATA2) VALUES ("DATA",OLD.',TMPCOL,');');

PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

【讨论】:

完美答案。 谢谢,但有新错误。 MySQL 说:#1336 - 存储函数或触发器中不允许使用动态 SQL 以下查询失败:“CREATE DEFINER=root@localhost TRIGGER before_employee_update AFTER UPDATE ON newjoineeform FOR EACH BEGIN DECLARE TMPCOL VARCHAR(100); SET TMPCOL= ' ID'; SET @s = CONCAT('INSERT INTO TMP(DATA1, DATA2) VALUES ("DATA",OLD.',TMPCOL,');'); PREPARE stmt1 FROM @s; 执行 stmt1; DEALLOCATE PREPARE stmt1; END " MySQL 说:#1336 - 存储函数或触发器中不允许使用动态 SQL 你是对的。那里不允许使用动态 SQL。另一种方法是使用 case 语句(或一系列 if/then/else)来选择从哪一列获取数据。另一种方法是对数据使用嵌套的 if 函数。由于您的问题不包括确定数据源列的逻辑,因此我无法编写任何示例。 @SloanThrasher ,请再次检查我已经更新了我的完整触发代码

以上是关于sql 触发器在将列名存储在变量中并将其用于 sql 触发器中的 OLD.myvar 时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

如何计算字符串并将其存储在变量中? [复制]

存储过程和触发器中的实时 SQL 问题

MySQL 存储函数 - 动态/变量表和列名

如何从存储过程中获取 SQL 字符串结果并将其保存在 C# Windows 应用程序字符串变量中

Python-Sqlalchemy-Postgres:如何将子查询结果存储在变量中并将其用于主查询

我应该如何使用 sql server 中的存储过程将列名存储在变量中?