我想创建一个动态过程,它将自动为我生成列但有些错误。我必须在我的程序中执行此操作几次,我真的不想手动执行此操作。
那就是我之前使用过的代码
DELIMITER $$
DROP PROCEDURE IF EXISTS RepeatLoopProc$$
CREATE PROCEDURE RepeatLoopProc()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
Declare @sql nvarchar(4000);
SET x = 0;
REPEAT
SET str = '';
SET str = CONCAT(str,'ossz_levon_het_',x);
SET x = x + 1;
set @sql='ALTER TABLE telephelyi_teszt ADD '+ str +'DOUBLE NULL';
execute @sql;
UNTIL x > 50
END REPEAT;
END$$
DELIMITER ;
我在Declare @sql nvarchar(4000);
行附近有任何想法的语法错误?
答案 0 :(得分:2)
使用DECLARE
在存储过程中创建局部变量时,请勿使用@
前缀。这些是会话变量。
但你无论如何都不应该声明变量。准备好的语句不适用于局部变量,只适用于会话变量。您不必声明会话变量。
您的ALTER TABLE语句有错误。你没有在列名之后和DOUBLE之前放置一个空格。换句话说,语句将如下所示,这将导致执行语法错误。
ALTER TABLE telephelyi_teszt ADD ossz_levon_het_1DOUBLE NULL
您没有预备声明。您不能只是将字符串EXECUTE作为语句。请参阅prepared statements手册中的示例。
在任何具有相同内容的表中创建50列可能是糟糕的设计。考虑创建第二个表,其中一列ossz_levon_het
和一个引用回到父表telephelyi_teszt
。这是First Normal Form建议避免重复列组。