在SQL Server中转换XML数据类型中的XML

ash*_*rya 2 xml sql t-sql sql-server sql-server-2008

我有一个名为tags的表,它看起来像这样:

 --------------------
|TagId   |   TagName |
--------------------
| 1      |   Travel  |
 --------------------
| 2      |   Gadgets |
 --------------------
| 3      |   Hobbies |
 --------------------
| 4      |   Movies  |
 -------------------- 
Run Code Online (Sandbox Code Playgroud)

我有另一个表,它有一个名为Tags的XML数据类型列.

    -------------------------------------------------------------------------
   |PostId   |   Title          | Tags                                       |
    -------------------------------------------------------------------------
   | 1       |  Blog Post 1     | <xml><tags><tag>1</tag/><tag>2</tag></tags>|
   --------------------------------------------------------------------------
   | 2       |  Blog Post 2     | <xml><tags><tag>2</tag/><tag>3</tag></tags>|
   --------------------------------------------------------------------------
   | 3       |  Blog Post 3     | <xml><tags><tag>3</tag/><tag>4</tag></tags>|
   --------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想组合这两个表中的数据,以创建一个看起来像这样的单个视图.节点内的数字应作为标签表的外键.

    ---------------------------------------------------------------------------
   | Title         | Tags                                                      |
    ---------------------------------------------------------------------------
   | Blog Post 1   | <xml><tags><tag>Travel</tag/><tag>Gadgets</tag><tags>     |
   ----------------------------------------------------------------------------
   | Blog Post 2   | <xml><tags><tag>Gadgets</tag/><tag>Hobbies</tag></tags>   |
   ----------------------------------------------------------------------------
   | Blog Post 3   | <xml><tags><tag>Hobbies</tag/><tag>Movies</tag></tags>    |
   ----------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

是否可以创建这样的视图?我怎么做?

Ben*_*Ben 5

像这样的东西应该做的伎俩:

/* SQL Follows */
select
postID, title,
tags,
(
    select 
        /* 4. Retrieve the tag name */
        y.tag.value('.', 'int') tagID,
        t.tagName
    from 
        /* 2. Shred the XML into nodes */
        p.tags.nodes('/xml/tags/tag') as y(tag)
        /* 3. Join the tag ID onto the tags table. */
        inner join #tags t on t.tagID = y.tag.value('.', 'int')
    for 
        /* 5. Convert it into XML */
        xml path('tag'), type
)tags2
/* 1. For each post */
from #posts p
Run Code Online (Sandbox Code Playgroud)

我使用临时表#tags#posts在这个例子.要获得确切的输出,您将需要稍微调整XML.