【问题标题】:SQL how to extract value from xml stringSQL如何从xml字符串中提取值
【发布时间】:2020-09-10 12:57:13
【问题描述】:
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)')

这是什么'。'表明它的目的是什么。

【问题讨论】:

    标签: sql-server function tsql xquery-sql


    【解决方案1】:

    阅读您发布的代码时,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 文档结构中提取所有&lt;U&gt; 元素。
    3. AS f( x ) 部分是一个声明,它声明了一个名为f 的新派生表,其中包含一个名为x 的列,映射到由@987654340 提取的&lt;U&gt; 元素@ 方法。注意x 的数据类型仍然是XML
    4. .value( path, type ) 方法提取指定的path 并将其公开为type 类型(在本例中为varchar(50))。

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

    【讨论】:

    • 谢谢,。值(路径,类型)在这里 path='.'表示?
    • 当 XPath 为 . 时,表示“自我”,即 &lt;U&gt; 元素的 #text 内容节点。见这里:stackoverflow.com/questions/38240763/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2013-07-22
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多