2011-05-23 73 views
0

我在SQL服务器中有一个表,用于存储提交的表单数据。这样收集到的数据被存储为名称值对中称为[FORMDATA]如在下面的例子...使用Xquery查询sql服务器中的XML列表

这用于收集所需的信息,但我能正常工作的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> 

回答

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