3

我正在使用以下方法生成 XML 文档FOR XML EXPLICIT

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属性。

我找到了一个解决方案,但它似乎是一个kludge。

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模式是必须的。

4

1 回答 1

2

如果根元素名称(即foo在问题中的示例数据中)在所有行中都相同,那么有一个简单的方法可以完成此操作:

  1. 在列名中指定AttributeName项(第 3 项)。就示例数据而言,那将是foo.

  2. 使用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因为XMLNVARCHAR都是 UTF-16 更好的选择):

SELECT 1 AS [Tag], NULL AS [Parent]
    , CONVERT(NVARCHAR(MAX), value) AS [x!1!!xml]
FROM @MyTable
FOR XML EXPLICIT;

有关详细信息,请参阅使用 EXPLICIT Mode with FOR XML的 MSDN 页面。

于 2015-12-26T09:22:07.803 回答