我有一个包含user_id的表,以及一个基本上包含一系列值的XML字段。我需要针对XML中的数据运行报告,但就我而言,我无法以任何有用的方式将XML从字段中取出。
这是表格的架构:
|-----------------|
| type | name |
|-----------------|
| int | user_id |
| XML | crest |
|-----------------|
以下是存储在faves字段中的XML示例:
<crest xmlns="SANITIZED" keyAttrib="slot" valueType="String">
<badge slot="0">Money</badge>
<badge slot="1">Independence</badge>
<badge slot="2">Power</badge>
</crest>
为了最轻松地生成我需要的报告,一个“关联”表,列出了他们获得的user_ids和每个徽章,每行1个徽章,因此每个用户最多可以有3行。我试图将数据转换为这样的形式:
|---------------------|
| type | name |
|---------------------|
| int | user_id |
| varchar | badge |
|---------------------|
我已经尝试了所有我能想到的东西,并搜索了互联网以及MSDN文档无济于事。无论我尝试什么,我似乎无法将数据按摩到我想要的形式。我相信这是可能的,但我知道如何让它发挥作用。任何帮助,提示或建议将不胜感激!
答案 0 :(得分:1)
你应该可以这样做:
;WITH XMLNAMESPACES('http://schemas.test.com' AS ns)
SELECT
tbl.user_id,
t.badges.value('@slot', 'int') AS 'Slot',
t.badges.value('.', 'varchar(60)') AS 'Badge'
FROM
dbo.YourTable tbl
CROSS APPLY
tbl.Crest.nodes('(/ns:crest/ns:badge)') AS t(badges)
基本上将基表“YourTable”与XML节点集合连接(假设您的XML名称空间为“http://schemas.test.com”)。从这个节点列表中,您只需要提取所需的部分,如INT,VARCHAR或它可能的任何类型。