如何解决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 )
行执行此操作:
-
@sql_xml
是具有XML
数据类型的T-SQL变量,该数据类型是“特殊”类型(例如,与int
或date
相比)因为它支持方法(在OOP的意义上)。 - 调用
XML.nodes(XQuery)
方法,该方法从XML文档结构中提取所有<U>
元素。-
nodes()
method is documented here顺势
-
-
AS f( x )
部分是一个声明,该声明声明了一个名为f
的新派生表,该表包含一个名为x
的映射到{{1 }}元素由<U>
方法提取。请注意,nodes()
的数据类型仍为x
。 -
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 举报,一经查实,本站将立刻删除。