SQL Server 转换 xml 并解析单个值,但不使用内置函数

Posted

技术标签:

【中文标题】SQL Server 转换 xml 并解析单个值,但不使用内置函数【英文标题】:SQL Server transform xml and parse single values but not with build-in functions 【发布时间】:2020-09-28 08:42:28 【问题描述】:

我正在尝试在 SQL Server 2016 中解析和转换 XML 值。我无法使用 sp_xml_preparedocumentsp_xml_removedocument 内置过程,因为我想将它放在表值函数中。

我想选择这 4 个

testXML...821327282 测试值 测试属性 测试属性

XML 模板值:

<?xml version="1.0" encoding="utf-8"?>
<stns1:testXML...821327282 xmlns:stns1="qaTESTXML">
   <myvalue>Test value</myvalue>
   <myattribute>Test attribute</myattribute>
   <myproperty>Test property</myproperty>
</stns1:testXML...821327282>

我的 T-SQL 尝试> 代码:

select
    [xml].[node].query('local-name(/ROOT[0]/id)') as [id],
    [xml].[node].query('local-name(/ROOT[0]/myvalue)') as [value],
    [xml].[node].query('local-name(/ROOT[0]/myattribute)') as [attribute],
    [xml].[node].query('local-name(/ROOT[0]/myproperty)') as [property]
from 
    @xml.nodes('/') as [xml]([node])

【问题讨论】:

【参考方案1】:

试试这个:

DECLARE @XML XML = '<?xml version="1.0" encoding="utf-8"?>
<stns1:testXML...821327282 xmlns:stns1="qaTESTXML">
   <myvalue>Test value</myvalue>
   <myattribute>Test attribute</myattribute>
   <myproperty>Test property</myproperty>
</stns1:testXML...821327282>'

-- you need to **include** and respect the XML namespace in your XML document!    
;WITH XMLNAMESPACES('qaTESTXML' AS ns1)
SELECT
    [node].value('(myvalue)[1]', 'varchar(50)') as [value],
    [node].value('(myattribute)[1]', 'varchar(50)') as [attribute],
    [node].value('(myproperty)[1]', 'varchar(50)') as [property]
FROM   
    @xml.nodes('/ns1:testXML...821327282') as [xml]([node])

不确定您的意思是什么选择testXML...821327282 - 这是一个 XML 元素/节点 - 不是一个值.....

更新:如果您需要获取根节点元素的“名称” - 您可以使用 - 请注意,使用 //myvalue 方法是 非常糟糕 - 尤其是在较大的 XML 文档上!您已被警告!

;WITH XMLNAMESPACES('qaTESTXML' AS ns1)
SELECT
    [node].value('local-name(.)[1]', 'varchar(50)') as rootnode,
    [node].value('(//myvalue)[1]', 'varchar(50)') as [value],
    [node].value('(//myattribute)[1]', 'varchar(50)') as [attribute],
    [node].value('(//myproperty)[1]', 'varchar(50)') as [property]
FROM   
    @xml.nodes('/ns1:*') as [xml]([node])

【讨论】:

“不确定你选择 testXML...821327282 值是什么意思” 也许他们还希望将文字字符串值 'testXML...821327282' 作为第一个结果是他们的结果集? ¯\_(ツ)_/¯ 您好 Marc_s,您好 Larnu,感谢您提供此代码片段。是否也可以解析这个 testXML...821327282 字符串文字?因为这也是我在数据集中需要的数字。其余的看起来对我来说还不错。 @Mario:好的,如果只是几行代码(如示例中的),性能影响将不会很明显 - 享受吧!

以上是关于SQL Server 转换 xml 并解析单个值,但不使用内置函数的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 的存储过程中解析 XML 并输出

如何在 SQL Server 2005 中插入值数组?

将字符串转换为xml并插入Sql Server

如何将 DateTime 的 SQL Server XML 类型值 (xsi:nil) 转换为 null

如何在 SQL Server 的单个批次中为列添加默认值并使用默认值更新所有行?

使用SQL Server中的OPENXML解析带有内联架构的XML文件