我正在使用FOR XML EXPLICIT
生成XML文档:
declare @MyTable table (value xml);
insert into @MyTable values
('<foo bar="data1">content1</foo>')
,('<foo bar="data2">content2</foo>')
,('<foo bar="data3">content3</foo>');
select 1 as Tag, null as Parent
, value as [x!1!!xml]
from @MyTable
for xml explicit;
得到这样的答复:
<x>
<foo bar="data1" xmlns="">content1</foo>
</x>
<x>
<foo bar="data2" xmlns="">content2</foo>
</x>
<x>
<foo bar="data3" xmlns="">content3</foo>
</x>
问题在于我不需要xmlns
属性。
我找到了一个解决方案,但它似乎是一个混合物。
select 1 as Tag, null as Parent
, cast (value as varchar(200)) as [x!1!!xml]
from @MyTable
for xml explicit;
有没有更优雅的方法来解决问题?
请勿使用FOR XML PATH/RAW/AUTO
。
EXPLICIT
模式是必须的。
答案 0 :(得分:2)
如果根元素名称(即问题中示例数据中的foo
)在所有行中相同,那么有一种简单的方法可以实现此目的:
在列名中指定 AttributeName 项(第3项)。就示例数据而言,这将是foo
。
使用xmltext
指令(第4项)代替xml
。
列名称为:
[x!1!foo!xmltext]
完整的查询将是:
SELECT 1 AS [Tag], NULL AS [Parent]
, value AS [x!1!foo!xmltext]
FROM @MyTable
FOR XML EXPLICIT;
但是如果根元素名称确实不同,则上述方法不是一个选项,似乎唯一的方法是将XML数据转换为NVARCHAR
(比VARCHAR
更好的选择XML
和NVARCHAR
都是UTF-16):
SELECT 1 AS [Tag], NULL AS [Parent]
, CONVERT(NVARCHAR(MAX), value) AS [x!1!!xml]
FROM @MyTable
FOR XML EXPLICIT;
有关详细信息,请参阅Use EXPLICIT Mode with FOR XML的MSDN页面。