gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:08:59 25 4
gpt4 key购买 nike

这让我发疯。无论如何,我都不是 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);

我的额头因为撞到我的 table 上而变平了。

最终目标是添加列 drivesn_0、driveinf_0、drivesn_1、driveinf_1 等一直到 drivesn_150 和 driveinf_150。分别为每个输入 VARCHAR(30) 和 VARCHAR(48)。

最佳答案

@variables 未声明,声明的变量标识符不以@开头。

此外,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 在评论中所说的是很好的建议,您可能应该有另一个表,例如 DRIVE_MASTER_DETAILS(x int, sn VARCHAR(30), dr VARCHAR(48))

关于mysql - 无法在过程循环中正确声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50282580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com