【问题标题】:Cannot correctly declare variable in procedure loop无法在过程循环中正确声明变量
【发布时间】:2018-10-21 07:06:06
【问题描述】:

这让我很生气。无论如何,我都不是 mysql 大师。我的目标是向表中添加大量列。我已经尝试了几种方法,并且程序在 DECLARE @FooA NVARCHAR(MAX); 上阻塞。不知道为什么。

感谢任何指点...

USE mydatabase;
DELIMITER $$
DROP PROCEDURE IF EXISTS RepeatLoopProc$$
CREATE PROCEDURE RepeatLoopProc()
BEGIN
   DECLARE x INT;
   DECLARE sn VARCHAR(30);
   DECLARE dr VARCHAR(48);
   DECLARE @FooA NVARCHAR(MAX);
   SET x = 0;
   WHILE (x <= 150) DO
     SET sn = CONCAT('drivesn_', x);
     SET dr = CONCAT('driveinf_', x);
     SET x = x + 1;
     SET @FooA = 'ALTER TABLE DRIVE_MASTER ADD ' + sn + ' VARCHAR(30), ADD ' + dr + ' VARCHAR(48)';
     EXEC sp_executesql @FooA;
   END WHILE;
END$$
DELIMITER ;

当我这样做时,我得到:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@FooA NVARCHAR(MAX);

我的额头因为撞到我的桌子上而变得扁平。

最终目标是将列 driven_0、driveinf_0、drivesn_1、driveinf_1 等一直添加到 driven_150 和 driveinf_150。分别输入 VARCHAR(30) 和 VARCHAR(48)。

【问题讨论】:

  • MySQL 不使用+ 连接字符串,你必须使用CONCAT() 函数。
  • 如果您要向表中添加大量相似的列,则您的架构可能设计不佳。重复的元素应该在行中,而不是在列中。

标签: mysql linux centos6 declare


【解决方案1】:

@variables 没有 DECLAREd 并且声明的变量的标识符不以 @ 开头。

此外,ALTER 语句通常在幕后重新创建表(相当于 CREATE TABLE newversion... INSERT INTO newversion SELECT * FROM oldversion ... DROP TABLE oldversion ... RENAME newversion)。所以你最好在循环中建立一个单独的 ALTER 语句,并且只执行一次。


例子:

   ...
   SET @FooA = 'ALTER TABLE DRIVE_MASTER';
   SET x = 0;
   WHILE (x <= 150) DO
     SET sn = CONCAT('drivesn_', x);
     SET dr = CONCAT('driveinf_', x);
     SET @FooA = CONCAT(@FooA 
                       , CASE WHEN x != 0 THEN ', ' ELSE '' END
                       , 'ADD ', sn, ' VARCHAR(30), ADD ', dr, ' VARCHAR(48)'
                 );
     SET x = x + 1;
   END WHILE;
   EXEC sp_executesql @FooA;
   ...

...但是 Barmar 在 cmets 中所说的是好建议,您可能应该只拥有另一张桌子,例如 DRIVE_MASTER_DETAILS(x int, sn VARCHAR(30), dr VARCHAR(48))

【讨论】:

  • 这就是我认为我正在做的事情。 Alter 每个循环只执行一次,一次添加两列。
  • 是的,不,我是说只改变一次;即使一次做两列,您仍然需要重新创建表格 151 次。在非常大的桌子上,即使一次也可能会非常长。请参阅我添加的示例以获取更多信息。
【解决方案2】:

我已经有多个表。基本上我使用它来编目主机中的驱动器序列号。主机最多可以有 150 个驱动器。其他表包含网络接口信息(macaddrs 等)。所有这些都由一个共同的索引值捆绑在一起。对于具有 150 个磁盘驱动器的系统,除了 150 列之外,我看不到其他方式。要么那个,要么我错过了一个基本概念。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多