0

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

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

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 列中是动态的,我可以'不只是设置所有列,因为每条记录只有一个项目/注释对的数据。

想法?

4

1 回答 1

1

您将无法依靠数据绑定将更改发送回原始数据透视表中的数据库。相反,您需要将每个更新捕获为一个“工作单元”。例如,项目 id=92,值 =“Tom”。也许以前第 92 项的值是“Joe”。您在这里的工作单元是更改项目 92 的值。

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

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

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

于 2009-09-03T00:36:44.727 回答