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)
是否可以创建这样的视图?我怎么做?
像这样的东西应该做的伎俩:
/* 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.