在SQLServer中,XML数据类型的应用范围是非常宽泛的,除了可以使用value和nodes处理一行拆多行的情况,我们还可以使用PATH处理多行合并成一行。
使用实例例子:使用PATH处理多行合并成一行。
创建一张表,表中针对同一分类存在不同的行值。
代码如下:
CREATETABLEXML_TEST(UserNameNVARCHAR()NOTNULLDEFAULT,UserValueNVARCHAR()NOTNULLDEFAULT)GO;--创建一张表,两列即可,一列用作分组,一列存储值INSERTINTOXML_TESTVALUES(N白茶,PowerBI),(N白茶,SQLServer),(N白茶,SSIS),(N黑茶,Embedded),(N黑茶,Azure),(N黑茶,Mysql),(N绿茶,Oracle),(N绿茶,SSRS)GO;--向表中插入值,针对同一分组,值不相同
我们来看一下数据结果:
接下来,我们就可以通过XMLPATH进行多行合并处理了。
代码如下:
SELECTA1.UserName,STUFF((SELECTN、+UserValueFROMXML_TESTWHEREXML_TEST.UserName=A1.UserNameFORXMLPATH()),1,1,)ASUserValueFROMXML_TESTASA1GROUPBYA1.UserNameGO;
结果如下:
这样我们就完成了多行合并的处理。
分步解析:
①XMLPATH用途
在上述代码中,XMLPATH起到的作用是什么?
代码如下:
SELECTN、+UserValueFROMXML_TESTFORXMLPATH()
我们先来看一下查询结果:
通过上面的结果,我们不难理解,其实它就是将查询结果集以XML形式呈现,将多行的查询结果,合并在同一行展示。
②GROUPBY
通过XMLPATH,我们可以将多行合并成一行进行展示,接下来其实就是通过GROUPBY进行分组合并。
先看下面的代码:
SELECTA1.UserName,(SELECTN、+UserValueFROMXML_TESTWHEREXML_TEST.UserName=A1.UserNameFORXMLPATH())ASUserValueFROMXML_TESTASA1
结果如下:
通过WHERE关键字,我们可以将XMLPATH的结果与表中原有UserName列进行自关联展示,但是会有很多的重复项,因此,我们需要通过GROUPBY来进行分组去重。
③STUFF函数
在上面的截图中,我们不难发现,每个结果前面都多了一个分隔符,很明显,从应用层来说,第一个分隔符是不需要的。
而STUFF函数,可以在源字符中,删除给定长度的字符序列,并且从指定的起始位置,插入给定的字符序列。
语法如下:
STUFF(source_string,start,length,change_string)
将上述代码,添加STUFF进行处理:
SELECTA1.UserName,STUFF((SELECTN、+UserValueFROMXML_TESTWHEREXML_TEST.UserName=A1.UserNameFORXMLPATH()),1,1,)ASUserValueFROMXML_TESTASA1
结果如下:
这里是白茶,一个PowerBI的初学者。