2016-09-07 74 views
2

我有一个表,如下所示:SQL Server的FOR XML:加入XML节点到一个XML

DECLARE @myTable TABLE (Ordinal INT, MyXML XML) 
INSERT INTO @myTable (Ordinal, MyXML) VALUES (1, '<Item AnyAttribute="anyValue">1</Item>') 
INSERT INTO @myTable (Ordinal, MyXML) VALUES (1, '<Item AnyAttribute="anyValue">2</Item>') 

当我加入了XML片段到一个大的XML有:

SELECT MyXML AS 'OmitMe' FROM @myTable FOR XML PATH(''), ROOT('Items'), TYPE 

我得到:

<Items> 
    <OmitMe> 
    <Item AnyAttribute="anyValue">1</Item> 
    </OmitMe> 
    <OmitMe> 
    <Item AnyAttribute="anyValue">2</Item> 
    </OmitMe> 
</Items> 

但我想获得:

<Items> 
    <Item AnyAttribute="anyValue">1</Item> 
    <Item AnyAttribute="anyValue">2</Item> 
</Items> 

使用变量不是一个选项,因为这意味着像游标一样循环mechinisme的必要性。

任何帮助将不胜感激!

马丁

编辑:

由Ed哈珀提供一个解决方案可以被纳入的东西更大的计划:

SELECT CAST(REPLACE(CAST((SELECT MyXML AS Items FROM @myTable FOR XML PATH ('')) AS NVARCHAR(MAX)),N'</Items><Items>',N'') AS XML) 

这是次优的,但它确实工作。

回答

2

看一看Columns with a Name Specified as a Wildcard Character

如果指定的列名是一个通配符(*),该列的 插入仿佛没有指定列名的内容。

SELECT MyXML AS '*' FROM @myTable FOR XML PATH(''), ROOT('Items'), TYPE 
+1

太棒了!正是我在找什么。 ;) –

+0

@Minin Giessen为了完整性:你可以用'SELECT MyXML AS [node()] ...'和'SELECT CAST(MyXML AS XML)...'来达到同样的效果。第二个工作,因为*计算*导致一个未命名的列。 – Shnugo