【问题标题】:How to remove unnecessary blank namespace and add namespace prefix in tSQL如何在 SQL 中删除不必要的空白命名空间并添加命名空间前缀
【发布时间】:2013-11-28 22:16:22
【问题描述】:

当我运行我的查询时,命名空间添加了根元素,但第二个元素我也有 xmlns="" ......我想删除它.​​.....我需要添加命名空间前缀一些元素。

我提供了一个例子:

declare @xml_h as xml
declare @xml_d as xml

select @xml_h = (
    select NewID() as [UID]
    for XML PATH('Head')
    )

select @xml_d = (
    select NULL, 
    (
        select 'V00001' as [ID],
            'Some name' as [Name]
        for XML PATH('SubData'), TYPE
    )
    for XML PATH('Data')
    )

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_h, @xml_d for XML PATH(''), ROOT('ROOT')

结果是:

<ROOT xmlns:t="uri_2" xmlns="uri_1">
    <Head xmlns="">
        <UID>B12B8836-2061-4934-AC06-67D34579D1A6</UID>
    </Head>
    <Data xmlns="">
        <SubData>
            <ID>V00001</ID>
            <Name>Some name</Name>
        </SubData>
    </Data>
</ROOT>

但我需要这个:

<ROOT xmlns:t="uri_2" xmlns="uri_1">
    <Head>
        <t:UID>B12B8836-2061-4934-AC06-67D34579D1A6</t:UID>
    </Head>
    <Data>
        <t:SubData>
            <t:ID>V00001</t:ID>
            <t:Name>Some name</t:Name>
        </t:SubData>
    </Data>
</ROOT>

有没有什么办法可以去掉不必要的空白命名空间并添加命名空间前缀?

谢谢

【问题讨论】:

  • 也许您可以将t: 添加到查询中的列名中,例如... select NewID() as [t:UID] 等等? sql server 应该如何知道命名空间前缀是?

标签: sql-server xml tsql sql-server-2005 xml-namespaces


【解决方案1】:

这将构建一个与您想要的等效的 XML。

declare @xml_h as xml
declare @xml_d as xml

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_h = (
    select NewID() as [t.UID]
    for XML PATH('Head')
    )

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_d = (
    select NULL, 
    (
        select 'V00001' as [t.ID],
            'Some name' as [t.Name]
        for XML PATH('t.SubData'), TYPE
    )
    for XML PATH('Data')
    )

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_h, @xml_d for XML PATH(''), ROOT('ROOT')
<ROOT xmlns:t="uri_2" xmlns="uri_1">
  <Head xmlns:t="uri_2" xmlns="uri_1">
    <t.UID>ABBECBF4-59BE-46DF-B42E-4325748E0079</t.UID>
  </Head>
  <Data xmlns:t="uri_2" xmlns="uri_1">
    <t.SubData xmlns:t="uri_2" xmlns="uri_1">
      <t.ID>V00001</t.ID>
      <t.Name>Some name</t.Name>
    </t.SubData>
  </Data>
</ROOT>

如您所见,子元素中重复了命名空间声明。如果您确实对此有疑问,您可以重写您的查询以使用 EXPLICIT Mode,或者您可以将您的投票添加到 this connect item,并希望它成为 SQL Server 未来版本的一部分。

【讨论】:

  • 感谢您的回复。最后,我不得不重写查询以使用 EXPLICIT 模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多