動的な数の列を持つようにクエリを動的に構築し、XMLのノードを解析するために必要な列を把握する必要があります。テーブルにかなりの量の行がある場合、サーバー上で困難になる可能性があります。 。
有効な設定名を保持するテーブルSetting
があり、そのテーブルをトリガーでテーブルに更新することをお勧めしSettings
ます。
設定を反映するビューを作成するには、ビューSetting
を動的に更新するトリガーをテーブルに追加します。
SQLフィドル
MS SQL Server 2008スキーマのセットアップ:
create table Settings
(
RowID int identity primary key,
Settings xml
)
go
create table Setting
(
Name varchar(20) primary key
)
go
create view v_Settings as
select RowID
from Settings
go
create trigger tr_Settings on Settings for insert, update as
with C(Name) as
(
select distinct T.N.value('text()[1]', 'nvarchar(20)')
from inserted as I
cross apply I.Settings.nodes('/root/Setting/Name') as T(N)
)
insert into Setting(Name)
select Name
from C
where C.Name not in (select Name from Setting)
go
create trigger tr_Setting on Setting for insert as
declare @SQL nvarchar(max)
set @SQL = 'alter view v_Settings as ' +
'select S.RowID'+
(
select ',S.Settings.value(''(root/Setting[Name="' +
S.Name +
'"]/Value/text())[1]'', ''varchar(max)'') as '+
quotename(S.Name)
from Setting as S
for xml path(''), type
).value('text()[1]', 'nvarchar(max)')+
' from Settings as S'
exec (@SQL)
クエリ1:
insert into Settings values
('<root>
<Setting>
<Name>BookingDate</Name>
<Value>01 Jan 2013</Value>
</Setting>
<Setting>
<Name>Price</Name>
<Value>23.66</Value>
</Setting>
</root>')
select *
from v_Settings
結果:
| ROWID | BOOKINGDATE | PRICE |
-------------------------------
| 5 | 01 Jan 2013 | 23.66 |
クエリ2:
insert into Settings values
('<root>
<Setting>
<Name>BookingDate</Name>
<Value>02 Jan 2013</Value>
</Setting>
<Setting>
<Name>PriceX</Name>
<Value>24.66</Value>
</Setting>
</root>')
select *
from v_Settings
結果:
| ROWID | BOOKINGDATE | PRICE | PRICEX |
-----------------------------------------
| 5 | 01 Jan 2013 | 23.66 | (null) |
| 6 | 02 Jan 2013 | (null) | 24.66 |
アップデート:
上記のコメントから、すべての可能な設定名を追跡するテーブルがすでにあるようです。その場合は、のトリガーは必要ありませんSettings
。Setting
テーブルを更新した後にビューが再構築されていることを確認するだけの場合は、実際にはトリガーをオンにする必要はありませんSetting
。