2013-03-12 62 views
0

我想添加和更新列的數量(P_1,P_2,P_3 ...)按順序到一個表。要更新P_2,我需要在上一步中更新P_1。有沒有寫一個循環,可以在SSMSsql服務器宏

for i in (1 to 10) 
    alter table tab1 add P_i 
    if(i>1) 
      update tab1 set P_i = P_(i-1)*2+[blah blah] 
    else 
      update tab1 set p_i = [blah blah] 
    end 
end 
+1

你爲什麼這樣做?我們通常不這樣對待表格結構。首先定義你需要的所有列的表格。然後使用例如WHILE編寫T/SQL塊或過程。 – criticalfix 2013-03-12 18:32:33

+0

重讀OP,我會同意criticalfix,你可能不想創建動態表結構。我錯過了你試圖有條件添加列。如果可能的話,創建一個固定的表結構;這是更好的數據庫設計。 – sqlfool 2013-03-12 18:39:28

+0

你可以用遊標和[動態SQL](http://www.sommarskog.se/dynamic_sql.html)來做到這一點,但更重要的問題是*爲什麼*你想這樣做。如果您使用適當的工具來生成和管理它們(通常是某種ORM),動態生成的數據模型並不總是一件壞事。但是用這種方式生成表結構是非常不尋常的:當代碼的其他部分需要在查詢中使用它們時,如何知道列的調用方式? – Pondlife 2013-03-12 21:08:58

回答

0

當然,你可以做到這一點的方式。下面是一些可以在SSMS中執行的條件邏輯的例子。這將向您展示如何執行WHILE循環,IF/THEN語句和CASE語句。 HTH。

-- DROP TABLE dbo.Test 
CREATE TABLE dbo.Test (myID INT); 

DECLARE @iteration INT = 0; 

WHILE @iteration < 10 
BEGIN 
    IF @iteration = 0 
    BEGIN 
     INSERT INTO dbo.Test VALUES (-1); 
    END; 
    ELSE 
    BEGIN 
     UPDATE dbo.Test 
     SET myID = CASE 
        WHEN @iteration = 1 THEN 0 
        WHEN @iteration = 2 THEN 123 
        ELSE @iteration 
        END; 
    END; 

    SELECT * FROM dbo.Test; 

    SET @iteration += 1; 
END;