在Sql Server中考虑这个表结构:
ID - uniqueidentifier
Params - xml
和以下格式的行:
<!--ROW1 xml column content-->
<Params>
<Module>
<ModuleName>Module1</ModuleName>
</Module>
<Module>
<ModuleName>Module2</ModuleName>
</Module>
</Params>
<!--ROW2 xml column content-->
<Params>
<Module>
<ModuleName>Module1</ModuleName>
</Module>
</Params>
预期输出(表中每个元素出现的总和):
_______________
| Module1 | 2 |
| Module2 | 1 |
|_____________|
每行中Module
元素的数量为0..n
。我试图创建存储过程,为每个xml字段输入返回多行,然后将每行的结果提供给临时表,但我找不到正确的语法。有人可以参考相关资源或显示一些小片段如何处理它?感谢您提供的任何提示。
答案 0 :(得分:1)
您可以应用一些xquery来获取模块名称,然后使用GROUP BY
计算它们:
SELECT ModuleName, COUNT(*) AS NumOccurrences
FROM
(
SELECT
Nodes.node.value('(ModuleName)[1]', 'varchar(50)') AS ModuleName
FROM
Modules m
cross apply m.Params.nodes('//Module') as Nodes(node)
) x
GROUP BY ModuleName;
(不幸的是,我们无法直接对xml进行分组,因此需要派生表)
答案 1 :(得分:1)
除了Stuart的回答,您还可以使用over
子句
select distinct
t.x.value('.','varchar(50)'),
COUNT(*) over (partition by t.x.value('.','varchar(50)'))
from yourtable
cross apply x.nodes('/Params/Module/ModuleName') t(x)