2009-08-07 102 views
0

我一直在打我的頭這,我敢肯定,我只是失去了一些東西很明顯,但...更新一個UNPIVOTted SQL表

我有一個客戶的數據庫中的表,這基本上:

Item_Set_Key int 
Item_1  bit 
Notes_1  nvarchar(80) 
Item_2  bit 
Notes_2  nvarchar(80) 
Item_3  bit 
Notes_3  nvarchar(80) 
... 

有一個在每個記錄99項,並沒有改變架構不是一個選項(其他外部因素有關)。

然而,爲了在任何遠程類似的情報向用戶顯示它,我們必須逆轉置它(通過View)是這樣的:

SELECT i.Item_Set_Key, i.Item_Number, i.Selected, i.Item, i2.Notes, i2.Note 
FROM (
SELECT Item_Set_Key, SUBSTRING (Item, 6, 2) AS Item_Number, Selected, Item 
    FROM Item_Set 
    UNPIVOT (Selected FOR Item IN 
     (Item_1, Item_2, Item_3, Item_4, Item_5, ...) 
    ) as u 
) AS i 
LEFT JOIN (
SELECT Item_Set_Key, SUBSTRING (Note, 7, 2) AS Item_Number, Notes 
    FROM Item_Set 
    UNPIVOT (Notes FOR Note IN 
     (Notes_1, Notes_2, Notes_3, Notes_4, Notes_5, ...) 
    ) as n 
) AS i2 ON i2.Item_Set_Key = i.Item_Set_Key 
    AND i2.Item_Number = i.Item_Number 

我做的,該標準結合網格。然而,我在茫然,如何構建它的UpdateCommand的東西,因爲文字必須明確命名的SET列,但列名的項目,並注意列動,我可以只是設置所有列,因爲每個記錄只有一個項目/音符對的數據。

想法?

回答

1

您將無法依靠數據綁定,將更改發送回數據庫在原來的迴轉工作臺。相反,您需要將每個更新作爲單個「工作單元」進行捕獲。例如,item id = 92,value =「Tom」。也許以前的項目92的價值是「喬」。你在這裏工作的單位是當用戶通過用戶界面,您可以批量的,各UOW並留住他們,直到他們準備點擊保存做出改變來改變值項目92

。當用戶要求保存時,每個被捕獲的UOW都是針對數據庫「播放」的。搜索「命令」模式和/或Jeremy Miller的一些文章。

另一個想法是,你說你無法改變的模式,但也許你真的可以。考慮創建一個未轉義格式的實際表格。然後用一個使用PIVOT命令的視圖替換當前表。實際上,您將數據存儲在更好的設計中,但對於您將它重新使用的現有應用程序而言。這可以工作,除非你需要在透視設計中進行更新。

最後一種辦法就是你可以簡單地保持兩個物理表,然後寫一些複雜的合併操作給他們定期同步。

+0

是啊,這就是我試圖避免。我希望有一種方法可以編寫INSERT/UPDATE/DELETE命令,這些命令不是一組大量的(有效的)SQL IF語句(並且這將非常龐大,需要處理幾百列)。模式問題源於這樣一個事實,即遺留系統也在積極更新大量數據格式的數據,所以是一個巨大的表格合併的東西將是醜陋的。我要這樣做的方式是一組sprocs,它包裝了設置的功能並對其進行了翻譯,以便我可以在INSERT/UPDATE/DELETE語句中使用對它們的調用。 – Thought 2009-09-09 22:50:25