更新UNPIVOTted SQL表

时间:2009-08-07 18:25:10

标签: sql unpivot

我一直在反对这一点,我确信我只是错过了一些明显的东西,但是......

我在客户的数据库中有一张表,基本上就是:

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个项目,并且不能更改架构(需要考虑其他外部因素)。

但是,为了将其显示在远离用户智能的任何东西中,我们必须将它(通过视图)UNPIVOT(例如):

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中明确命名列,但列名在Item和Note列中是动态的,我可以不要设置所有列,因为每条记录只有一个项目/注释对的数据。

想法?

1 个答案:

答案 0 :(得分:1)

您将无法依赖数据绑定将更改发送回原始数据透视表中的数据库。相反,您需要将每个更新捕获为单个“工作单元”。例如,item id = 92,value =“Tom”。也许之前项目92的价值是“乔”。您的工作单位是更改项目92的值。

当用户通过用户界面进行更改时,您可以将每个UOW批处理并保持在一起,直到他们准备好单击保存。当用户请求保存时,每个捕获的UOW都将对数据库“播放”。搜索“命令”模式和/或Jeremy Miller的一些文章。

另一个想法是你说你不能改变架构,但也许你真的可以。考虑创建一个不透明格式的真实表。然后用使用PIVOT命令的视图替换当前表。实际上,您将数据存储在更好的设计中,但是对于现有的应用程序,您可以将其保留回来。除非您需要在轮回设计中进行更新,否则这可能会有效。

最后一个选项是您可以简单地维护两个物理表,然后编写一些复杂的合并操作来定期同步它们。