【问题标题】:A CONCATENATED INSERT wont accept a WHERE clauseCONCATATENATED INSERT 不会接受 WHERE 子句
【发布时间】:2012-10-06 16:19:34
【问题描述】:

这让我非常难过。我有一个如下所示的 MySQL 存储过程。

 DELIMITER $$

CREATE PROCEDURE `lms`.`leads_to_bak` ()
BEGIN
SET @table1 = (SELECT `tabler_name` FROM `sets` WHERE `on_off`=0 LIMIT 1);
SET @table2 = CONCAT(@table1, '_bak');
SET @SQL1 = CONCAT('INSERT INTO ',@table2, '(', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table2), ')', ' SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table1), ' FROM ', @table1);
PREPARE stmt FROM @sql1;
EXECUTE stmt;
END$$

DELIMITER ;

现在重要的部分是:

SET @SQL1 = CONCAT('INSERT INTO ',@table2, '(', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table2), ')', ' SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table1), ' FROM ', @table1);

现在看来,语句可以翻译成

INSERT INTO @table2 (col1, col2, col3, ...)[minus lead_id] SELECT (col1, col2, col3, ...)[minus lead_id] FROM @table1

很简单吧?好吧,我试图在INSERT 语句的末尾附加一个WHERE 子句,使其看起来像这样:

INSERT INTO @table2 (col1, col2, col3, ...) SELECT (col1, col2, col3, ...) FROM @table1 WHERE set_id = (SELECT set_id FROM sets WHERE on_off = 0);

但没有骰子。错误多多。哎呀,我什至尝试过:

INSERT INTO (col1, col2, col3, ...) SELECT (col1, col2, col3, ...) FROM @table1 WHERE set_id = 1;

字符串输出为:

INSERT INTO leads_auto_bak(set_id,new_old,upload_date,agent,vendors,callcenter,generation_date,first_name,last_name,email,phone,address,city,state,zip,dob,gender,marital_status,rented,year,make,model,trim,vin,primary_use,miles_oneway,mileage,license_num,license_state,education,job_title,license_status) SELECT set_id,new_old,upload_date,agent,vendors,callcenter,generation_date,first_name,last_name,email,phone,address,city,state,zip,dob,gender,marital_status,rented,year,make,model,trim,vin,primary_use,miles_oneway,mileage,license_num,license_state,education,job_title,license_status FROM leads_auto

但还是一无所获。我在结尾处尝试了CONCAT 那条线的不同方式,但它不会让步。有人给点建议吗?

【问题讨论】:

    标签: mysql sql stored-procedures insert


    【解决方案1】:

    您缺少要插入的表名:

    INSERT INTO MYTABLE (col1, col2, col3) 
    SELECT col1, col2, col3
    FROM @table1 
    WHERE ...
    

    另外,请注意SELECT 子句中的列周围不应有括号。

    【讨论】:

    • 这只是一个错字。但请注意,我在脚本本身中有表名。我得到的错误是SET @SQL1 = CONCAT('INSERT INTO ',@table2, '(', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table2), ')', ' SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table1), ' FROM ', @table1);,它有一个表名。括号是故意的,所以我可以传达正在发生的事情。请只关注原始代码的完整性。
    • 你能提供你的字符串连接的实际输出吗?
    • 现在有些事情我不知道该怎么做。如何返回连接的语句字符串?
    • 你可以 SELECT @SQL1 它应该返回语句。
    猜你喜欢
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2016-10-28
    • 1970-01-01
    • 2019-01-15
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多