我找到了一种从一行中获取值的好方法,这些行用逗号分隔成单独的行:
SELECT
q2.value
FROM
(SELECT
CAST('<x>' + REPLACE(Data, ',', '</x><x>') + '</x>' AS XML) AS thexml
FROM
MyTable) q1
CROSS APPLY
(SELECT
x.value('.', 'VARCHAR(100)') AS value
FROM
thexml.nodes('x') AS f(x)) q2
但是有一个令人困惑的部分,希望有人能对此有所解释:
(SELECT
x.value('.', 'VARCHAR(100)') AS value
FROM
thexml.nodes('x') AS f(x)) q2
答案 0 :(得分:0)
q1是派生表,具有XML类型的xml的单列,每行从MyTable开始。
q1.thexml,在执行替换和强制转换操作后,将MyTable.Data中所有以前用逗号分隔的值保存为x元素的简单平面序列-每个都包含一个原始的逗号分隔值。>
nodes方法调用仅返回一个单列表,每个x元素一行(也就是说,每个原始逗号分隔值一行)
请注意,如果源数据中包含任何XML字符,则按原样编写的查询将无法正常工作,并且对于较大的数据集,性能可能会成为问题。
在SQL Server 2016中,引入了功能STRING_SPLIT。这将从字符串(例如,用逗号分隔)值的字符串中返回单个列表。
请参阅:https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
答案 1 :(得分:0)
美好的一天,
您提到的(SELECT x.value('.','varchar(100)') as value FROM thexml.nodes('x') as f(x)) q2
查询部分基于xml数据类型方法。
查询的这一部分x.value('.','varchar(100)')
基于XML数据类型(you can read more here)的Method value(),并使用XQuery表达式来检索XML实例内部的数据。
这部分thexml.nodes('x')
使用thexml的值,并使用nodes()方法在内部对其进行解析。 You can read more in this document。