微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL如何从XML字符串中提取值

如何解决SQL如何从XML字符串中提取值

CREATE FUNCTION split_string_XML
(
    @in_string VARCHAR(MAX),@delimiter VARCHAR(1)
)
RETURNS @list TABLE(NAMES VARCHAR(50))
AS
BEGIN
DECLARE @sql_xml XML = Cast('<root><U>'+ Replace(@in_string,@delimiter,'</U><U>')+ '</U></root>' AS XML)
    
    INSERT INTO @list(NAMES)
    SELECT f.x.value('.','VARCHAR(50)') AS NAMES
    FROM @sql_xml.nodes('/root/U') f(x)
    WHERE f.x.value('.','VARCHAR(50)') <> ''
    RETURN
END
GO

我无法理解下一行的语法和功能

 SELECT f.x.value('.','VARCHAR(50)')

这是什么意思。表示其目的是什么。

解决方法

在阅读您发布的代码时,f并不是立即显而易见的,因为作者没有使用显式的AS关键字。

所以这个:

INSERT INTO @list(NAMES)
SELECT f.x.value('.','VARCHAR(50)') AS NAMES
FROM @sql_xml.nodes('/root/U') f(x)
WHERE f.x.value('.','VARCHAR(50)') <> ''

可以扩展为:

INSERT INTO
    @list( NAMES )
SELECT
    f.x.value( '.','VARCHAR(50)' ) AS NAMES
FROM
    @sql_xml.nodes('/root/U') AS f( x )  /*  `f` is declared here */
WHERE
    f.x.value('.','VARCHAR(50)') <> ''

@sql_xml.nodes('/root/U') AS f( x )行执行此操作:

  1. @sql_xml是具有XML数据类型的T-SQL变量,该数据类型是“特殊”类型(例如,与intdate相比)因为它支持方法(在OOP的意义上)。
  2. 调用XML.nodes(XQuery)方法,该方法从XML文档结构中提取所有<U>元素。
  3. AS f( x )部分是一个声明,该声明声明了一个名为f的新派生表,该表包含一个名为x的映射到{{1 }}元素由<U>方法提取。请注意,nodes()的数据类型仍为x
  4. XML方法提取指定的.value( path,type )并以类型path(在这种情况下为type)公开它。

也就是说,如果使用此函数将输入值列表拆分为一个表,则不要这样做Instead use table-valued parameters directly so you don't need to faff around with splitting strings

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。