无法在过程循环中正确声明变量

z4iuyo4d  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(275)

这让我抓狂。我根本不是mysql大师。我的目标是向表中添加大量列。我已经尝试了几种方法,但是这个过程阻塞了declare@fooanvarchar(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);

我的额头因为撞到table而变得扁平。
最终目标是将drivesn\u 0、driveinf\u 0、drivesn\u 1、driveinf\u 1等列添加到drivesn\u 150和driveinf\u 150。分别键入varchar(30)和varchar(48)。

efzxgjgh

efzxgjgh1#

我已经有多张table了。基本上我是用这个目录驱动器序列号在主机上。主机最多可以有150个驱动器。其他表包含网络接口信息(macaddrs等)。全部由一个共同的索引值绑定在一起。对于一个有150个磁盘驱动器的系统,我只能看到150列。不是这样,就是我遗漏了一个基本概念。

uubf1zoe

uubf1zoe2#

@未声明变量,且已声明变量的标识符不以@开头。
另外,alter语句通常在幕后重新创建一个表(相当于createtablenewversion。。。插入到新版本选择*从旧版本。。。删除表旧版本。。。重命名为新版本)。因此,最好在循环中构建一个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;
   ...

... 但巴尔马在评论中所说的是一个很好的建议,你应该换一张table,比如 DRIVE_MASTER_DETAILS(x int, sn VARCHAR(30), dr VARCHAR(48))

相关问题