2009-08-07 6 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個の項目があり、スキーマを変更することはできません(その他の外部の考慮事項)。このような

しかし、遠隔地のユーザにインテリジェンスに似たもので、それを表示するために、我々は(ビュー経由で)それをアンピボットする必要があります。

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

データバインディングを使用して元のピボットテーブルの変更をデータベースに戻すことはできません。代わりに、各アップデートを単一の「作業単位」として取得する必要があります。たとえば、item id = 92、value = "Tom"などです。以前のアイテム92の価値はおそらく「ジョー」でした。ここでの作業単位は、項目92の値を変更することです。

ユーザーがユーザーインターフェースを変更すると、各UOWをバッチして保存することができます。ユーザーが保存を要求すると、キャプチャされた各UOWがデータベースに対して「再生」されます。 "コマンド"パターンやJeremy Millerの記事を検索してください。

もう1つの考えでは、スキーマを変更できないと言われていますが、おそらく本当に可能です。ピボット解除された形式の実表を作成することを検討してください。次に、現在の表をPIVOTコマンドを使用するビューに置き換えます。実際にはデータをより良いデザインで保存しますが、既存のアプリケーションではそのデータを元に戻します。これはピボットされたデザインの中で更新を行う必要がない限り機能します。

最後のオプションでは、2つの物理テーブルを単純に維持してから、複雑なマージ操作を記述して定期的に同期させることができます。

+0

ええ、これは私が避けようとしていたものです。私は、(効果的に)SQLのIF文の巨大なセットではなかったINSERT/UPDATE/DELETEコマンドを書く方法があることを期待していました。スキーマの問題は、レガシーシステムが積極的に大規模な列形式のデータを更新しているという事実に由来しています。巨大なテーブルマージ問題は醜いでしょう。私がこれと一緒に行く方法は、設定された機能をラップして変換するsprocsのセットです。そのため、INSERT/UPDATE/DELETEステートメントでそれらの呼び出しを使用できます。 – Thought

関連する問題

 関連する問題