2017-12-22 10 views
4

テーブルの列の名前を変更する必要があるときはいつでも、必要なパラメータを渡してエラーなく実行できるように、動的プロシージャを作成する必要があります。したがって、IFの検証。次のように変更するダイナミックプロシージャ列名

このコードによって生成されたエラーは次のとおりです。

あなたのSQL構文でエラーが発生しています。 が近く を使用する権利構文についてはMySQLサーバのバージョンに対応していること取扱説明書を確認してください「の場合EXISTS( TABLE_NAME = information_schema.columns SELECT * FROM 『の人々』」解決行1

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'); 
+0

存在する場合(SELECTは.... SQLサーバの構文 –

+0

@RaymondNijlandのNopです。あなたは同じコードを残して、パラメータを削除する場合は、ハードコードされたにすべてを変えますそれは動作します。 –

+0

あなたがconcat関数を使用した方法は、SQLサーバー構文の検索です。 –

答えて

0

で、手順が行われた方法が間違っていた。

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 
    IF EXISTS (SELECT * FROM information_schema.COLUMNS WHERE table_name = tableName AND column_name = columnName) THEN 
     SET @query = CONCAT('ALTER TABLE `', tableName, '` CHANGE COLUMN `', columnName, '` `', newColumnName, '` ', columnType, ' DEFAULT ', defaultValue, ';'); 
     PREPARE stmt1 FROM @query; 
     EXECUTE stmt1; 
     DEALLOCATE PREPARE stmt1; 
    END IF;  
END ;; 
DELIMITER ; 

CALL `change_column_name`('People', 'Nme', 'Name', 'VARCHAR(50)', 'NULL');