这让我抓狂。我根本不是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)。
2条答案
按热度按时间efzxgjgh1#
我已经有多张table了。基本上我是用这个目录驱动器序列号在主机上。主机最多可以有150个驱动器。其他表包含网络接口信息(macaddrs等)。全部由一个共同的索引值绑定在一起。对于一个有150个磁盘驱动器的系统,我只能看到150列。不是这样,就是我遗漏了一个基本概念。
uubf1zoe2#
@未声明变量,且已声明变量的标识符不以@开头。
另外,alter语句通常在幕后重新创建一个表(相当于createtablenewversion。。。插入到新版本选择*从旧版本。。。删除表旧版本。。。重命名为新版本)。因此,最好在循环中构建一个alter语句,并且只执行一次。
例子:
... 但巴尔马在评论中所说的是一个很好的建议,你应该换一张table,比如
DRIVE_MASTER_DETAILS(x int, sn VARCHAR(30), dr VARCHAR(48))