我在SQL服务器中有一个用于存储提交的表单数据的表。 每个提交的表单字段都是动态的,因此收集的数据作为名称值对存储在名为[formdata]的XML数据列中,如下例所示......
这适用于收集所需信息,但我现在需要将此数据呈现为平面文件或excel文档以供人员进行处理,我想知道这样做的最佳方法是使用Xquery,以便数据是否可读?
表格如下......
[id], [user_id], [datestamp], [formdata]
formdata的示例值
<formfields>
<item>
<itemKey>USER_NAME</itemKey>
<itemValue>test</itemValue>
</item>
<item>
<itemKey>value2</itemKey>
<itemValue>test</itemValue>
</item>
<item>
<itemKey>MYID</itemKey>
<itemValue>5468512</itemValue>
</item>
<item>
<itemKey>testcheckbox</itemKey>
<itemValue>item1,item3</itemValue>
</item>
<item>
<itemKey>samplevalue</itemKey>
<itemValue>item3</itemValue>
</item>
<item>
<itemKey>accept_terms</itemKey>
<itemValue>True</itemValue>
</item>
</formfields>
答案 0 :(得分:1)
这是你想要的吗?
select
id,
[user_id],
datestamp,
f.i.value('itemKey[1]', 'varchar(50)') as itemKey,
f.i.value('itemValue[1]', 'varchar(50)') as itemValue
from YourTable as T
cross apply T.formdata.nodes('/formfields/item') as f(i)
测试:
declare @T table
(
id int,
user_id int,
datestamp datetime,
formdata xml
)
insert into @T (id, user_id, datestamp, formdata)
values (1, 1, getdate(),
'<formfields>
<item>
<itemKey>USER_NAME</itemKey>
<itemValue>test</itemValue>
</item>
<item>
<itemKey>value2</itemKey>
<itemValue>test</itemValue>
</item>
<item>
<itemKey>MYID</itemKey>
<itemValue>5468512</itemValue>
</item>
<item>
<itemKey>testcheckbox</itemKey>
<itemValue>item1,item3</itemValue>
</item>
<item>
<itemKey>samplevalue</itemKey>
<itemValue>item3</itemValue>
</item>
<item>
<itemKey>accept_terms</itemKey>
<itemValue>True</itemValue>
</item>
</formfields>
'
)
select
id,
[user_id],
datestamp,
f.i.value('itemKey[1]', 'varchar(50)') as itemKey,
f.i.value('itemValue[1]', 'varchar(50)') as itemValue
from @T as T
cross apply T.formdata.nodes('/formfields/item') as f(i)
结果:
id user_id datestamp itemKey itemValue
1 1 2011-05-23 15:38:55.673 USER_NAME test
1 1 2011-05-23 15:38:55.673 value2 test
1 1 2011-05-23 15:38:55.673 MYID 5468512
1 1 2011-05-23 15:38:55.673 testcheckbox item1,item3
1 1 2011-05-23 15:38:55.673 samplevalue item3
1 1 2011-05-23 15:38:55.673 accept_terms True