如何查询SQL Server 2005中的XML字段,使其行为类似于表?

时间:2010-02-03 14:58:53

标签: sql-server xml

我有一个包含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文档无济于事。无论我尝试什么,我似乎无法将数据按摩到我想要的形式。我相信这是可能的,但我知道如何让它发挥作用。任何帮助,提示或建议将不胜感激!

1 个答案:

答案 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或它可能的任何类型。