【发布时间】:2018-06-05 01:28:46
【问题描述】:
我需要创建一个动态过程,以便每当我需要重命名表的列时,我都会传递所需的参数,并且它可以正确执行。所以IF的验证。
这段代码产生的错误如下:
您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 'IF EXISTS (SELECT * FROM information_schema.columns WHERE 第 1 行的 table_name = 'People''
DROP PROCEDURE IF EXISTS `change_column_name`;
DELIMITER ;;
CREATE PROCEDURE `change_column_name`(IN tableName VARCHAR(100), IN columnName VARCHAR(100), IN newColumnName VARCHAR(100), IN columnType VARCHAR(20), IN defaultValue VARCHAR(100))
BEGIN
SET @query = CONCAT('IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = \'', tableName, '\' AND column_name = \'', columnName, '\') THEN
ALTER TABLE \'', tableName, '\' CHANGE COLUMN \'', columnName, '\' \'', newColumnName, '\' ', columnType, ' DEFAULT ', defaultValue, ';
END IF;');
PREPARE stmt1 FROM @query;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END ;;
DELIMITER ;
CALL `change_column_name`('People', 'Nme', 'Name', 'VARCHAR(50)', 'NULL');
【问题讨论】:
-
iF EXISTS(SELECT .... 是 SQL 服务器语法
-
@RaymondNijland Nop。如果您保留相同的代码并删除参数,请将所有内容更改为硬编码即可。
-
你使用concat函数的方式是对它进行SQL server语法搜索
-
@RaymondNijland 好的,那为什么删除参数并保持硬编码会起作用?
-
不要相信生成的字符串变量@qeury 仅包含无效的 MySQL 语法。您需要将 SELECT 和 ALTER 表查询分开才能在 MySQL 中工作。我现在不能写答案,因为我现在正在打电话