Обновление UNPIVOTted таблицы SQL - PullRequest
0 голосов
/ 07 августа 2009

Я бьюсь головой об этом, и я уверен, что мне просто не хватает чего-то очевидного, но ...

У меня есть таблица в базе данных клиента, это в основном:

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 элементов, и изменение схемы невозможно (другие внешние факторы).

Однако, чтобы отобразить его во всем, что напоминает пользователю что-то интеллектуально, мы должны ОТКЛЮЧИТЬ его (через представление) следующим образом:

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 Ответ

1 голос
/ 03 сентября 2009

Вы не сможете полагаться на привязку данных для отправки изменений обратно в базу данных в исходной сводной таблице. Вместо этого вам нужно фиксировать каждое обновление как отдельную «единицу работы». Например, идентификатор элемента = 92, значение = "Том". Возможно, ранее значение пункта 92 было «Джо». Ваша единица работы здесь - изменить значение для элемента 92.

Когда пользователь вносит изменения через пользовательский интерфейс, вы можете объединять каждое UOW и удерживать их, пока они не будут готовы нажать кнопку Сохранить. Когда пользователь запрашивает сохранение, каждое захваченное UOW «проигрывается» против базы данных. Ищите вокруг шаблон «команды» и / или некоторые статьи Джереми Миллера.

Другая мысль - ты сказал, что не можешь изменить схему, но, возможно, ты действительно можешь. Подумайте о создании реальной таблицы в формате univivoted. Затем замените текущую таблицу представлением, использующим команду PIVOT. Фактически вы сохраняете данные в лучшем дизайне, но для существующего приложения вы PIVOT возвращаете их. Это может сработать, если вам не нужно делать обновления, пока оно находится в сводном дизайне.

Последний вариант - вы можете просто поддерживать две физические таблицы, а затем написать некоторую сложную операцию слияния для их периодической синхронизации.

...