使用 FOR XML EXPLICIT 时删除 xmlns="" name space 声明

Remove xmlns="" name space declaration when using FOR XML EXPLICIT

我正在使用 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模式是必须的。

如果根元素名称(即问题示例数据中的 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;

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