使用SQL XQuery从XML提取任务UID及逗号分隔的对应PredUID值
实现方案
该需求可以直接通过XQuery内置的string-join()函数实现,该函数支持将序列中的多个字符串用指定分隔符拼接,刚好匹配多PredUID逗号分隔的需求。
通用XQuery语句
针对你提供的XML结构,直接用以下XQuery即可输出预期格式:
for $task in /Tasks/Task return concat( $task/UID/text(), ' ', string-join($task/Predecessor/PredUID/text(), ',') )
逻辑说明:
- 遍历每个
<Task>节点 - 先提取当前任务的UID文本值
- 拼接空格后,用
string-join把当前任务下所有<PredUID>的文本值用逗号拼接成单个字符串
SQL Server环境下的完整调用示例
如果是在SQL Server中执行,完整的SQL写法如下:
DECLARE @xml XML = N' <Tasks> <Task> <UID>14</UID> <Name>Entertainment</Name> <ID>2</ID> <PerComp>22</PerComp> <Predecessor> <PredUID>12</PredUID> <PredType>1</PredType> </Predecessor> </Task> <Task> <UID>12</UID> <Name>Movie</Name> <ID>1</ID> <PerComp>55</PerComp> <Predecessor> <PredUID>13</PredUID> <PredType>1</PredType> </Predecessor> <Predecessor> <PredUID>14</PredUID> <PredType>1</PredType> </Predecessor> </Task> <Task> <UID>15</UID> <Name>Star</Name> <ID>3</ID> <PerComp>100</PerComp> <Predecessor> <PredUID>12</PredUID> <PredType>1</PredType> </Predecessor> <Predecessor> <PredUID>17</PredUID> <PredType>1</PredType> </Predecessor> <Predecessor> <PredUID>18</PredUID> <PredType>1</PredType> </Predecessor> </Task> </Tasks> ' -- 输出分栏格式结果 SELECT T.Task.value('(UID/text())[1]', 'INT') AS UID, T.Task.query('string-join(Predecessor/PredUID/text(), ",")').value('.', 'VARCHAR(100)') AS PredUIDs FROM @xml.nodes('/Tasks/Task') AS T(Task)
执行后输出结果完全匹配预期:
| UID | PredUIDs |
|---|---|
| 14 | 12 |
| 12 | 13,14 |
| 15 | 12,17,18 |
如果需要直接输出空格分隔的单行格式,把SELECT部分改成下面的写法即可:
SELECT T.Task.query('concat((UID/text())[1], " ", string-join(Predecessor/PredUID/text(), ","))').value('.', 'VARCHAR(100)') AS Result FROM @xml.nodes('/Tasks/Task') AS T(Task)
内容的提问来源于stack exchange,提问作者Riyas Hussain
相关产品推荐
相关产品推荐

