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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...