2013-11-20 121 views
1

我想創建一個動態過程,它將自動爲我生成列,但有些事情是錯誤的。我必須在我的程序中多次執行此操作,而且我不想手動執行此操作。動態添加循環的列

所以這就是我

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

在@sql中缺少'和double之間的空格。 – DaImTo

+0

我修正了它,但在@sql聲明附近的第7行有相同的錯誤 – balage90

+1

這是什麼類型的項目,你必須在表中創建動態字段?你應該改善你的規範化,這樣就不會發生。 –

回答

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的建議,以避免重複組的列。

+0

+1的設計提示。我在評論 –

+0

@JorgeCampos上也是這樣說的,對,你是對的。當然,每條規則都有例外,但是像這樣添加50列絕對是[code smell](http://en.wikipedia.org/wiki/Code_smell)。 –

+0

看起來我的嘴巴上了一個小窩,之後也許它更容易接受 – balage90