【问题标题】:How to handle white space in XML headers?如何处理 XML 标头中的空白?
【发布时间】:2022-01-18 06:55:43
【问题描述】:

SQL Server 2012。给定以下 XML:

<header>
    <subheader>
        <Problems>
            <RAW VALUE="1" Sublot="abc"/>
            <RAW VALUE="2" Sublot="def"/>
            <RAW VALUE="3" Sublot="ghi"/>
        </Problems>
    </subheader>
</header>

如何在 SQL Server 中解析 XML?我在处理“RAW VALUE”作为名称时遇到问题,例如

SELECT *
FROM OPENXML (@docHandle, '/header/subheader/Problems', 1)
WITH (
    'RAW VALUE' VARCHAR (100)
);

由于“RAW VALUE”周围的引号而无效。括号也不起作用。有没有办法支持“RAW VALUE”中的空间?

【问题讨论】:

  • OPENXML 应该避免,因为它是资源泄漏的常见来源——人们在完成文档句柄后经常忘记调用sp_xml_removedocument。 Microsoft 文档示例通常也忽略了这一点,这无济于事。更喜欢使用nodes()query()value() 方法。
  • 我已经在调用 sp_xml_removedocument。您对我的实际问题有任何信息吗?
  • 根据Specifying ColPattern for mapping between columns and the XML attributes 文档...[RAW VALUE] varchar(100) 'RAW[1]/@VALUE'
  • 看来你对XML命名有误解。在您的情况下,有一个 element &lt;Problems&gt;{...}&lt;/Problems&gt; 和几个 self-closure elements &lt;RAW /&gt; 所有这些都包含相同的两个 attributes @ 987654335@ 和Sublot="xyz"。在这种情况下,它只是看起来像一个名称中的空白

标签: sql-server xml


【解决方案1】:

使用@ XPath 表达式前缀访问 XML 元素的属性,例如:@VALUE 用于 VALUE 属性,@Sublot 用于 Sublot 属性...

declare @example xml = N'<header>
  <subheader>
    <Problems>
      <RAW VALUE="1" Sublot="abc"/>
      <RAW VALUE="2" Sublot="def"/>
      <RAW VALUE="3" Sublot="ghi"/>
    </Problems>
  </subheader>
</header>';

select
  prob.raw.value('@VALUE', N'nvarchar(100)') as [Value],
  prob.raw.value('@Sublot', N'nvarchar(100)') as [Sublot]
from @example.nodes('/header/subheader/Problems/RAW') prob(raw);

产生结果:

Value Sublot
1 abc
2 def
3 ghi

【讨论】:

  • 完美,谢谢!我没有足够的积分来投票,但我试过了!
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2018-06-04
相关资源
最近更新 更多