灵活运用 SQL Server 数据库的 FOR XML PATH

系统 1859 0

起因

今天欧阳冰提出一个报表需求,其核心部分可以简化为这样一张表格:

调度单号 与调度单相关的多张作业单号
001 0001/0002/0003
002 0004
003 0005/0006/0007/0008

从上述表格可以看出,如何把调度单的多行作业单明细的单号合并到同一行的一个字段中,并用斜杠 / 分隔,是这个需求的难点。

解决

于是到网上去搜索了一下,有这样一篇文章: 灵活运用 SQL SERVER FOR XML PATH
其中介绍了 SQL Server 数据库的 FOR XML PATH 关键字的用法。

在一句 SELECT 语句的最后加上 FOR XML PATH ,就可以 把整个结果数据集变成一个 xml 字符串 。大家可以自行尝试一下。
而如果使用 FOR XML PATH('') ,则是 去除所有 xml 节点标记,只剩下原原本本的数据 。我们要的就是这个。

于是,我们可以写 SQL:

      
        SELECT
      
       DH
      
        .
      
      DH_DISPATCH_NO DISPATCH_NO
      
        ,
      
      
        (
      
      
        SELECT
      
       CLH
      
        .
      
      CLH_CARGO_LOAD_NO 
      
        +
      
      
        '/'
      
      
        FROM
      
       TM_DISPATCH_CARGO_LOAD_L DCLL
      
        ,
      
       TM_CARGO_LOAD_H CLH 

        
      
        WHERE
      
       DH
      
        .
      
      BILLID 
      
        =
      
       DCLL
      
        .
      
      BILLID 
      
        AND
      
       DCLL
      
        .
      
      DCLL_CARGO_LOAD_HEADER_ID 
      
        =
      
       CLH
      
        .
      
      BILLID 

        
      
        FOR
      
       XML PATH
      
        (
      
      
        ''
      
      
        )
      
      
        )
      
       NOS 


      
        FROM
      
       TM_DISPATCH_H DH 


      
        GROUP
      
      
        BY
      
       DH
      
        .
      
      BILLID
      
        ,
      
       DH
      
        .
      
      DH_DISPATCH_NO


      
        ;
      
    

这样就已经差不多了,但是多张作业单号这一列最后总是多个斜杠 /。

为了把最后这个斜杠去掉,我们还要使用一下 LEFT 函数。那么最终可以使用这样一句 SQL 来满足上述需求:

      
        SELECT
      
       DISPATCH_NO
      
        ,
      
      
        LEFT
      
      
        (
      
      NOS
      
        ,
      
       LEN
      
        (
      
      NOS
      
        )
      
      
        -
      
      
        1
      
      
        )
      
       CARGO_LOAD_NOS


      
        FROM
      
      
        (
      
      
        SELECT
      
       DH
      
        .
      
      DH_DISPATCH_NO DISPATCH_NO
      
        ,
      
      
        (
      
      
        SELECT
      
       CLH
      
        .
      
      CLH_CARGO_LOAD_NO 
      
        +
      
      
        '/'
      
      
        FROM
      
       TM_DISPATCH_CARGO_LOAD_L DCLL
      
        ,
      
       TM_CARGO_LOAD_H CLH 

                
      
        WHERE
      
       DH
      
        .
      
      BILLID 
      
        =
      
       DCLL
      
        .
      
      BILLID 
      
        AND
      
       DCLL
      
        .
      
      DCLL_CARGO_LOAD_HEADER_ID 
      
        =
      
       CLH
      
        .
      
      BILLID 

                
      
        FOR
      
       XML PATH
      
        (
      
      
        ''
      
      
        )
      
      
        )
      
       NOS 

        
      
        FROM
      
       TM_DISPATCH_H DH 

        
      
        GROUP
      
      
        BY
      
       DH
      
        .
      
      BILLID
      
        ,
      
       DH
      
        .
      
      DH_DISPATCH_NO 

        
      
        )
      
       TMP 


      
        ORDER
      
      
        BY
      
       DISPATCH_NO 


      
        ;
      
    

灵活运用 SQL Server 数据库的 FOR XML PATH


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论