我在写一个存储过程的时候想把当前一个表(cash_total_by_factory_100101)中的一部分数据复制到一个临时表中,语句如下    DROP TABLE IF EXISTS cash_total_by_factory;
    SET mysql = ("CREATE TEMPORARY TABLE cash_total_by_factory select * from cash_total_by_factory_",regionCode," where count_date BETWEEN '", beginDate,"' AND '", endDate,"'");
    SET @sql = mysql;
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;但运行的时候报错了,错误是 operand should contains 1 column(s),
请大虾赐教

解决方案 »

  1.   

    执行SQL语句DROP TABLE IF EXISTS cash_total_by_factory;
    CREATE TEMPORARY TABLE cash_total_by_factory 
    SELECT * FROM cash_total_by_factory_100101 WHERE COUNT_DATE BETWEEN '2010-09-20 17:10:05' AND '2010-10-20 17:10:05';
    SELECT * FROM cash_total_by_factory是没问题的
      

  2.   

        SET mysql = ("CREATE TEMPORARY TABLE cash_total_by_factory select * from cash_total_by_factory_",regionCode," where count_date BETWEEN '", beginDate,"' AND '", endDate,"'");
        SET @sql = mysql;
        select @sql;贴出来看一下,估计有什么变量没有传入。
      

  3.   

    我现在就留了这几句:
    DROP TABLE IF EXISTS cash_total_by_factory;  
    SET s_sql = ("CREATE TEMPORARY TABLE cash_total_by_factory (select * from cash_total_by_factory_100101 where count_date BETWEEN '", beginDate,"' AND '", endDate,"')"); SET @sql = s_sql; select @sql;
    还是报那个错 operand should contains 1 column(s),去掉那个查询条件就不会报这个错的表cash_total_by_factory_100101的DDL语句是
    CREATE TABLE `cash_total_by_factory_100101` (
      `ID` bigint(12) NOT NULL AUTO_INCREMENT,
      `FACTORY_CODE` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `POSITION_CODE` int(11) NOT NULL,
      `PRODUCT_TYPE_CODE` int(11) NOT NULL,
      `CONTRACT_MONEY` decimal(12,2) NOT NULL DEFAULT '0.00',
      `YF_MONEY` decimal(12,2) NOT NULL DEFAULT '0.00',
      `SS_MONEY` decimal(12,2) NOT NULL DEFAULT '0.00',
      `DEAL_TIMES` int(11) NOT NULL DEFAULT '0',
      `MAX_COST` decimal(12,2) NOT NULL DEFAULT '0.00',
      `CASH_MODE_ID` tinyint(11) NOT NULL,
      `COUNT_DATE` date NOT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1054 DEFAULT CHARSET=utf8;
      

  4.   

    贴出完整的create procedure 语句。
      

  5.   

    CREATE DEFINER=`root`@`%` PROCEDURE `proc_report_cashPerSqM_2_0`(in regionCode INT, in beginDate VARCHAR(20), in endDate VARCHAR(20),in mallCode INT, in floorCode INT, in productTypeCode INT, in factoryType INT,  in pageCount INT, in pageSize INT, in type int, in factoryCode VARCHAR(10), out totalCount INT, out contractMoney DECIMAL(12,2), out  yfMoney DECIMAL(12,2), out ssMoney DECIMAL(12,2), out area DECIMAL(12,2))
    BEGIN DECLARE s_sql  VARCHAR(1500) CHARSET utf8; DECLARE s_column VARCHAR(1000); DROP TABLE IF EXISTS cash_total_by_factory;   /*where count_date BETWEEN '", beginDate,"' AND '", endDate,"' */ SET s_sql = ("CREATE TEMPORARY TABLE cash_total_by_factory (select * from cash_total_by_factory_100101 where count_date BETWEEN '", beginDate,"' AND '", endDate,"')"); SET @sql = s_sql; select @sql;/* PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP TABLE IF EXISTS tmp_cash_record; CREATE TEMPORARY TABLE tmp_cash_record( `FACTORY_NAME` varchar(50) collate utf8_unicode_ci NOT NULL,   `FACTORY_CODE` varchar(7) collate utf8_unicode_ci NOT NULL, `FACTORY_TYPE_NAME` varchar(7) collate utf8_unicode_ci NOT NULL, `POSITION_NAME` varchar(50) collate utf8_unicode_ci NOT NULL, `PRODUCT_TYPE_NAME` varchar(50) collate utf8_unicode_ci NOT NULL, `COUNT_DATE` DATE,   `CONTRACT_MONEY` decimal(12,2) NOT NULL default '0.00',   `YF_MONEY` decimal(12,2) default '0.00',   `SS_MONEY` decimal(12,2) default '0.00', `FACTORY_AREA` decimal(12,2) default '0.00', `PX` decimal(12,2) default '0.00' ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; SET s_column = "FACTORY_NAME, FACTORY_CODE, FACTORY_TYPE_NAME, POSITION_NAME,PRODUCT_TYPE_NAME, COUNT_DATE, CONTRACT_MONEY, YF_MONEY, SS_MONEY, FACTORY_AREA, PX"; SET s_sql = CONCAT('insert into tmp_cash_record(',s_column,')'); SET s_sql = CONCAT(s_sql ,"SELECT f.FACTORY_NAME, f.FACTORY_CODE, ft.TYPE_NAME, p.P_NAME, pt.VALUE, c.COUNT_DATE, SUM(IFNULL(c.CONTRACT_MONEY, 0)), SUM(IFNULL(c.YF_MONEY,0)),SUM(IFNULL(c.SS_MONEY,0)), f.FACTORY_AREA, "); IF type = 1 THEN SET s_sql = concat(s_sql, " ROUND(IFNULL(IFNULL(SUM(c.CONTRACT_MONEY), 0)/IFNULL( f.FACTORY_AREA, 0), 0), 2)"); ELSE SET s_sql = concat(s_sql, " ROUND(IFNULL(IFNULL(SUM(c.SS_MONEY), 0)/IFNULL( f.FACTORY_AREA, 0), 0), 2)"); END IF; SET s_sql = concat(s_sql, "FROM factory_", regionCode, " AS f LEFT JOIN cash_total_by_factory_", regionCode," AS c ON f.FACTORY_CODE = c.FACTORY_CODE LEFT JOIN sys_position_", regionCode," AS p ON f.POSITION_CODE = p.P_CODE LEFT JOIN rw_product_type_", regionCode, " AS pt ON left(f.PRODUCT_TYPE_ID, 3) = pt.CODE LEFT JOIN factory_type_2_0 AS ft ON f.FACTORY_TYPE_ID = ft.TYPE_ID WHERE (c.COUNT_DATE BETWEEN '", beginDate,"' AND '", endDate,"'  OR c.COUNT_DATE IS NULL) "); IF factoryCode <>0 THEN SET s_sql = concat(s_sql, " AND f.FACTORY_CODE ='", factoryCode, "'"); END IF; IF mallCode  <>0 THEN IF floorCode  <>0 THEN SET s_sql = concat(s_sql, "  AND  p.P_CODE = ", floorCode); ELSE SET s_sql = concat(s_sql, " AND  p.P_CODE LIKE '", mallCode, "%' "); END IF; END IF; IF productTypeCode  <>0 THEN SET s_sql = concat(s_sql, "  AND  pt.CODE = ", productTypeCode); END IF; IF factoryType <>0 THEN SET s_sql = concat(s_sql, "  AND  f.FACTORY_TYPE_ID = ", factoryType); END IF; SET s_sql = concat(s_sql, " GROUP BY f.FACTORY_CODE"); SET @sql = s_sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;*//* SET s_sql = CONCAT("select * from tmp_cash_record ORDER BY PX DESC, FACTORY_CODE  LIMIT ", pageCount, " , ", pageSize, ";"); SET @sql = s_sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;CALL proc_PageList("tmp_cash_record",""," PX DESC, FACTORY_CODE",pageCount,pageSize); select * from tmp_cash_record; SELECT COALESCE(COUNT(distinct FACTORY_NAME),0) INTO totalCount  FROM tmp_cash_record; SELECT IFNULL(SUM(CONTRACT_MONEY),0) INTO contractMoney FROM tmp_cash_record; SELECT IFNULL(SUM(YF_MONEY),0) INTO yfMoney FROM tmp_cash_record; SELECT IFNULL(SUM(SS_MONEY),0) INTO ssMoney FROM tmp_cash_record; SELECT IFNULL(SUM(FACTORY_AREA),0) INTO area FROM tmp_cash_record;*/ /* CALL proc_report_cashPerSqM_2_0(100101,'2010-10-08','2010-10-08',@count,@count,@count,@count,@count,@count,@count,@count,@count,@count,@count,@count,@count) */END;
      

  6.   

    你的语法根本不对!
    SET s_sql = ("CREATE TEMPORARY TABLE cash_total_by_factory (select * from cash_total_by_factory_100101 where count_date BETWEEN '", beginDate,"' AND '", endDate,"')");
    改成
    SET s_sql = concat("CREATE TEMPORARY TABLE cash_total_by_factory (select * from cash_total_by_factory_100101 where count_date BETWEEN '", beginDate,"' AND '", endDate,"')");mysql> delimiter //
    mysql>
    mysql> CREATE  PROCEDURE `proc_report_cashPerSqM_2_0`(in regionCode INT, in begi
    nDate VARCHAR(20), in endDate VARCHAR(20),in mallCode INT, in floorCode INT, in
    productTypeCode INT, in factoryType INT,  in pageCount INT, in pageSize INT, in
    type int, in factoryCode VARCHAR(10), out totalCount INT, out contractMoney DECI
    MAL(12,2), out  yfMoney DECIMAL(12,2), out ssMoney DECIMAL(12,2), out area DECIM
    AL(12,2))
        -> BEGIN
        ->  DECLARE s_sql  VARCHAR(1500) CHARSET utf8;
        ->  DECLARE s_column VARCHAR(1000);
        ->
        ->  DROP TABLE IF EXISTS cash_total_by_factory;
        ->  SET s_sql = concat("CREATE TEMPORARY TABLE cash_total_by_factory (select
     * from cash_total_by_factory_100101 where count_date BETWEEN '", beginDate,"' A
    ND '", endDate,"')");
        ->  SET @sql = s_sql;
        ->  select @sql;
        ->
        -> END;
        -> //
    Query OK, 0 rows affected (0.04 sec)mysql> delimiter ;
    mysql> call proc_report_cashPerSqM_2_0(0,'2010-01-01','2010-11-01',0,0,0,0,0,0,0
    ,0,@a,@b,@c,@d,@e);
    +-------------------------------------------------------------------------------
    -------------------------------------------------------------------+
    | @sql
                                                                       |
    +-------------------------------------------------------------------------------
    -------------------------------------------------------------------+
    | CREATE TEMPORARY TABLE cash_total_by_factory (select * from cash_total_by_fact
    ory_100101 where count_date BETWEEN '2010-01-01' AND '2010-11-01') |
    +-------------------------------------------------------------------------------
    -------------------------------------------------------------------+
    1 row in set (0.00 sec)Query OK, 0 rows affected, 1 warning (0.03 sec)