FOR XML EXPLICIT使用-2

该文为上篇FOR XML EXPLICIT使用的详细过程。

 

declare @t table (

SendID nvarchar(50),

ChannelsID nvarchar(50) ,

DeliveryLoc nvarchar(50) ,

MsgNo nvarchar(50) ,

MsgDate datetime ,

Coin nvarchar(50) ,

Amt float,

Remark nvarchar(50) ,

ContactName nvarchar(50) ,

ContactTel nvarchar(50) ,

ContactAddress nvarchar(50),

ItemNo int ,

PartNo nvarchar(50) ,

Unit nvarchar(50) ,

Price float ,

Qty_BY Float ,

SubAmt_BY Float ,

DeliveryDate_BY datetime ,

ItemRemark_BY nvarchar(50)

)

 

insert @t select'','34010019','南京江宁镇宁桥北路','3410052400009808','2010-5-24 10:33:18','RMB','0','测试接口(南京仓)','刘拓','18602520723','南京江宁镇宁桥北路','1','01000188','','1000.0000','6','0','2010-5-24 10:37:17',''  union all

select'','34010019','南京江宁镇宁桥北路','3410052400009808','2010-5-24 10:33:18','RMB','0','测试接口(南京仓)','刘拓','18602520723','南京江宁镇宁桥北路','2','01000189','','1000.0000','4','0','2010-5-24 10:37:17',''  union all

select'','330A0000','无锡开锋路小吏巷','3410052400009811','2010-5-24 10:33:18','RMB','0','测试接口(无锡仓)','刘拓','18602520723','无锡开锋路小吏巷','1','01000188','','1000.0000','3','0','2010-5-24 10:37:17',''   union all

select'','330A0000','无锡开锋路小吏巷','3410052400009811','2010-5-24 10:33:18','RMB','0','测试接口(无锡仓)','刘拓','18602520723','无锡开锋路小吏巷','2','01000189','','1000.0000','7','0','2010-5-24 10:37:17',''

 

 

;with  SOMaster as(

select distinct SendID,

ChannelsID,

DeliveryLoc,

MsgNo,

MsgDate,

Coin,

Amt,

Remark,

ContactName,

ContactTel,

ContactAddress from  @t)

/*以下的SOMaster都为引用该管用表达式*/

 

--下面按顺序来编写查询代码

--1,首先生成根节点

 

    SELECT

           1 AS Tag,

           NULL AS Parent,

           NULL AS 'SOMasters!1'

    FOR XML EXPLICIT

 /*

 

 "Tag" 是一个强制列. 它告诉XML解析器元素的层次,代表最高节点。

 

 "Parent"  同样也是一个强制列,必须存在. 代表的是当前节点的父节点。代码中

           NULL表示没有父节点,也就是该层次为顶层。

 

"SOMasters!1" 此种形式代表的是根节点。

          "SOMasters" 元素名称

          "1" 代表的是指定层次结构的节点级别

 */

 

 /*

 输出:    

         

 <SOMasters/>

 */

 

--2,下面生成下一层节点,应该是SOMaster节点,这些数据来自SOMaster

 

 

SELECT

       1 AS Tag,

       NULL AS Parent,

       NULL AS 'SOMasters!1',

       NULL AS 'SOMaster!2!SendID!ELEMENT',

       NULL AS 'SOMaster!2!ChannelsID!ELEMENT',

       NULL AS 'SOMaster!2!DeliveryLoc!ELEMENT',

       NULL AS 'SOMaster!2!MsgNo!ELEMENT',

       NULL AS 'SOMaster!2!MsgDate!ELEMENT',

       NULL AS 'SOMaster!2!Coin!ELEMENT',

       NULL AS 'SOMaster!2!Amt!ELEMENT',

       NULL AS 'SOMaster!2!Remark!ELEMENT',

       NULL AS 'SOMaster!2!ContactName!ELEMENT',

       NULL AS 'SOMaster!2!ContactTel!ELEMENT',

       NULL AS 'SOMaster!2!ContactAddress!ELEMENT'

UNION ALL

 

SELECT

       2 AS Tag,

       1 AS Parent,

       NULL

       ,SendID

       ,ChannelsID

       ,DeliveryLoc

       ,MsgNo

       ,MsgDate

       ,Coin

       ,ltrim(Amt)

       ,Remark

       ,ContactName

       ,ContactTel

       ,ContactAddress

      FROM

          SOMaster 

 

FOR XML EXPLICIT

/*

      "Tag"

          此次为代表的是第二层节点

      "Parent"

          1代表这些记录有一个"1"父节点. Parent值代表了TAG的父节点.

      "SOMaster!2!ContactAddress!ELEMENT"

         SOMaster:元素名称

         2:代表节点的层次

         ContactAddress:在指定的SOMaster元素中要构造的元素名称

         ELEMENT:指定ContactAddress为构造元素

      ....

*/

 

/*

输出:

<SOMasters>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>330A0000</ChannelsID>

    <DeliveryLoc>无锡开锋路小吏巷</DeliveryLoc>

    <MsgNo>3410052400009811</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(无锡仓)</Remark>

    <ContactName>刘拓</ContactName>

    <ContactTel>18602520723</ContactTel>

    <ContactAddress>无锡开锋路小吏巷</ContactAddress>

  </SOMaster>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>34010019</ChannelsID>

    <DeliveryLoc>南京江宁镇宁桥北路</DeliveryLoc>

    <MsgNo>3410052400009808</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(南京仓)</Remark>

    <ContactName>刘拓</ContactName>

    <ContactTel>18602520723</ContactTel>

    <ContactAddress>南京江宁镇宁桥北路</ContactAddress>

  </SOMaster>

</SOMasters>

*/

 

---添加SODetails节点,查看XML我们发现每个SOMaster节点下都需要一个SODetails节点。

 

 

 

SELECT

       1 AS Tag,

       NULL AS Parent,

       NULL AS 'SOMasters!1',

       NULL AS 'SOMaster!2!SendID!ELEMENT',

       NULL AS 'SOMaster!2!ChannelsID!ELEMENT',

       NULL AS 'SOMaster!2!DeliveryLoc!ELEMENT',

       NULL AS 'SOMaster!2!MsgNo!ELEMENT',

       NULL AS 'SOMaster!2!MsgDate!ELEMENT',

       NULL AS 'SOMaster!2!Coin!ELEMENT',

       NULL AS 'SOMaster!2!Amt!ELEMENT',

       NULL AS 'SOMaster!2!Remark!ELEMENT',

       NULL AS 'SOMaster!2!ContactName!ELEMENT',

       NULL AS 'SOMaster!2!ContactTel!ELEMENT',

       NULL AS 'SOMaster!2!ContactAddress!ELEMENT',

      

       NULL AS 'SODetails!3!ELEMENT'--SODetails

UNION ALL

 

SELECT

       2 AS Tag,

       1 AS Parent,

       NULL

       ,SendID

       ,ChannelsID

       ,DeliveryLoc

       ,MsgNo

       ,MsgDate

       ,Coin

       ,ltrim(Amt)

       ,Remark

       ,ContactName

       ,ContactTel

       ,ContactAddress

       ,NULL

      FROM

          SOMaster 

UNION ALL

 

 SELECT

       3 AS Tag,

       2 AS Parent,

       NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

    FROM

          SOMaster 

         

FOR XML EXPLICIT

 

/*

输出:

 

<SOMasters>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>330A0000</ChannelsID>

    <DeliveryLoc>无锡开锋路小吏巷</DeliveryLoc>

    <MsgNo>3410052400009811</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(无锡仓)</Remark>

    <ContactName>刘拓</ContactName>

    <ContactTel>18602520723</ContactTel>

    <ContactAddress>无锡开锋路小吏巷</ContactAddress>

  </SOMaster>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>34010019</ChannelsID>

    <DeliveryLoc>南京江宁镇宁桥北路</DeliveryLoc>

    <MsgNo>3410052400009808</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(南京仓)</Remark>

    <ContactName>刘拓</ContactName>

    <ContactTel>18602520723</ContactTel>

    <ContactAddress>南京江宁镇宁桥北路</ContactAddress>

   

    --注意下面个节点成为最后一个SOMaster的部分不是我们需要的格式。

   

    <SODetails /> 

    <SODetails />

  </SOMaster>

</SOMasters>

 

*/

 

 --下面我们看没有FOR XML EXPLICIT查询返回的结果集

 

 

 

SELECT

       1 AS Tag,

       NULL AS Parent,

       NULL AS 'SOMasters!1',

       NULL AS 'SOMaster!2!SendID!ELEMENT',

       NULL AS 'SOMaster!2!ChannelsID!ELEMENT',

       NULL AS 'SOMaster!2!DeliveryLoc!ELEMENT',

       NULL AS 'SOMaster!2!MsgNo!ELEMENT',

       NULL AS 'SOMaster!2!MsgDate!ELEMENT',

       NULL AS 'SOMaster!2!Coin!ELEMENT',

       NULL AS 'SOMaster!2!Amt!ELEMENT',

       NULL AS 'SOMaster!2!Remark!ELEMENT',

       NULL AS 'SOMaster!2!ContactName!ELEMENT',

       NULL AS 'SOMaster!2!ContactTel!ELEMENT',

       NULL AS 'SOMaster!2!ContactAddress!ELEMENT',

      

       NULL AS 'SODetails!3!ELEMENT'--SODetails

UNION ALL

 

SELECT

       2 AS Tag,

       1 AS Parent,

       NULL

       ,SendID

       ,ChannelsID

       ,DeliveryLoc

       ,MsgNo

       ,MsgDate

       ,Coin

       ,ltrim(Amt)

       ,Remark

       ,ContactName

       ,ContactTel

       ,ContactAddress

       ,NULL

      FROM

          SOMaster 

UNION ALL

 

 SELECT

       3 AS Tag,

       2 AS Parent,

       NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

       ,NULL

    FROM

          SOMaster 

 

 /*

结果:

 

Tag         Parent     ...    SODetails!3!ELEMENT

----------- -------- -------    --------------------

1           NULL    ...    NULL

2           1       ...    NULL

2           1       ...    NULL

3           2       ...     NULL

3           2       ...    NULL

 

(5 行受影响)

 

注意结果集的最后行,这就是为什么SODetails节点只是最后一个SOMaster节点的部分。

要形成我们期望的格式就要改变最后行的顺序

*/

 

--所以我们加入ChannelsID排序生成的行号来改变结果集的顺序。

 

 

 

 SELECT

          0 as sort,

           1 AS Tag,

           NULL AS Parent,

           NULL AS 'SOMasters!1',

           NULL AS 'SOMaster!2!SendID!ELEMENT',

           NULL AS 'SOMaster!2!ChannelsID!ELEMENT',

           NULL AS 'SOMaster!2!DeliveryLoc!ELEMENT',

           NULL AS 'SOMaster!2!MsgNo!ELEMENT',

           NULL AS 'SOMaster!2!MsgDate!ELEMENT',

           NULL AS 'SOMaster!2!Coin!ELEMENT',

           NULL AS 'SOMaster!2!Amt!ELEMENT',

           NULL AS 'SOMaster!2!Remark!ELEMENT',

           NULL AS 'SOMaster!2!ContactName!ELEMENT',

           NULL AS 'SOMaster!2!ContactTel!ELEMENT',

           NULL AS 'SOMaster!2!ContactAddress!ELEMENT',

           NULL AS 'SODetails!3!ELEMENT'

         

      UNION ALL

 

      SELECT

         ROW_NUMBER() over(order by ChannelsID)*100 as sort,

          2 AS Tag,

          1 AS Parent,

          NULL

           ,SendID

           ,ChannelsID

           ,DeliveryLoc

           ,MsgNo

           ,MsgDate

           ,Coin

           ,ltrim(Amt)

           ,Remark

           ,ContactName

           ,ContactTel

           ,ContactAddress

          ,NULL

      

      FROM

          SOMaster  

 

       UNION ALL

 

      SELECT

         ROW_NUMBER() over(order by ChannelsID)*100+1 as sort,

          3 AS Tag,

          2 AS Parent,

          NULL

          ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

          ,NULL

       

      FROM SOMaster

ORDER BY sort

 

 

/*

(4 行受影响)

sort                 Tag     Parent     .....      SODetails!3!ELEMENT

-------------------- ---------  ---------- -------       --------------------

0                    1           NULL      .....      NULL

100                  2           1        .....      NULL

101                  3           2        .....      NULL

200                  2           1        .....      NULL

201                  3           2        .....      NULL

 

(5 行受影响)

 

注意,行即为之前的最后的行。前面我们排序用行号*100以达到需要的效果。

*/

 

/*

下面如果我们直接在上面的代码基础上加上FOR XML EXPLICIT查询的话会报错

因为当我们用FOR XML EXPLICIT查询时候所有列出去'Tag''Parent'之外都必

须是形如ElementName!TagNumber!AttributeName!Directive,所以我们需要一

个外部查询来去掉SORT列。

*/

 

SELECT     Tag,

           Parent,

           [SOMasters!1],

           [SOMaster!2!SendID!ELEMENT],

           [SOMaster!2!ChannelsID!ELEMENT],

           [SOMaster!2!DeliveryLoc!ELEMENT],

           [SOMaster!2!MsgNo!ELEMENT],

           [SOMaster!2!MsgDate!ELEMENT],

           [SOMaster!2!Coin!ELEMENT],

           [SOMaster!2!Amt!ELEMENT],

           [SOMaster!2!Remark!ELEMENT],

           [SOMaster!2!ContactName!ELEMENT],

           [SOMaster!2!ContactTel!ELEMENT],

           [SOMaster!2!ContactAddress!ELEMENT],

           [SODetails!3!ELEMENT]

 

FROM (

 SELECT

          0 as sort,

           1 AS Tag,

           NULL AS Parent,

           NULL AS 'SOMasters!1',

           NULL AS 'SOMaster!2!SendID!ELEMENT',

           NULL AS 'SOMaster!2!ChannelsID!ELEMENT',

           NULL AS 'SOMaster!2!DeliveryLoc!ELEMENT',

           NULL AS 'SOMaster!2!MsgNo!ELEMENT',

           NULL AS 'SOMaster!2!MsgDate!ELEMENT',

           NULL AS 'SOMaster!2!Coin!ELEMENT',

           NULL AS 'SOMaster!2!Amt!ELEMENT',

           NULL AS 'SOMaster!2!Remark!ELEMENT',

           NULL AS 'SOMaster!2!ContactName!ELEMENT',

           NULL AS 'SOMaster!2!ContactTel!ELEMENT',

           NULL AS 'SOMaster!2!ContactAddress!ELEMENT',

           NULL AS 'SODetails!3!ELEMENT'

         

      UNION ALL

 

      SELECT

         ROW_NUMBER() over(order by ChannelsID)*100 as sort,

          2 AS Tag,

          1 AS Parent,

          NULL

           ,SendID

           ,ChannelsID

           ,DeliveryLoc

           ,MsgNo

           ,MsgDate

           ,Coin

           ,ltrim(Amt)

           ,Remark

           ,ContactName

           ,ContactTel

           ,ContactAddress

          ,NULL

      

      FROM

          SOMaster  

 

       UNION ALL

 

      SELECT

         ROW_NUMBER() over(order by ChannelsID)*100+1 as sort,

          3 AS Tag,

          2 AS Parent,

          NULL

          ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

         ,NULL

          ,NULL

       

      FROM SOMaster

      ) A

ORDER BY sort

FOR XML EXPLICIT

 

 

/*

结果:

 

<SOMasters>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>330A0000</ChannelsID>

    <DeliveryLoc>无锡巷号</DeliveryLoc>

    <MsgNo>3410052400009811</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(无锡仓)</Remark>

    <ContactName>刘明</ContactName>

    <ContactTel>13556239865</ContactTel>

    <ContactAddress>无锡号</ContactAddress>

    <SODetails />

  </SOMaster>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>34010019</ChannelsID>

    <DeliveryLoc>南京北路号</DeliveryLoc>

    <MsgNo>3410052400009808</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(南京仓)</Remark>

    <ContactName>刘明</ContactName>

    <ContactTel>13556239865</ContactTel>

    <ContactAddress>南京北路号</ContactAddress>

    <SODetails />

  </SOMaster>

</SOMasters>

 

*/

 

/*

上面已经确定了节点的顺序,下面我们就在SODetails下添加SODetail节点.

同样需要注意他们的顺序.

 

*/

select     Tag,

           Parent,

           [SOMasters!1], -- empty root element

           [SOMaster!2!SendID!ELEMENT],

           [SOMaster!2!ChannelsID!ELEMENT],

           [SOMaster!2!DeliveryLoc!ELEMENT],

           [SOMaster!2!MsgDate!ELEMENT],

           [SOMaster!2!Coin!ELEMENT],

           [SOMaster!2!Amt!ELEMENT],

           [SOMaster!2!Remark!ELEMENT],

           [SOMaster!2!ContactName!ELEMENT],

           [SOMaster!2!ContactTel!ELEMENT],

           [SOMaster!2!ContactAddress!ELEMENT],

           [SODetails!3!ELEMENT],

           [SODetail!4!ItemNo!ELEMENT],

           [SODetail!4!PartNo!ELEMENT],

           [SODetail!4!Unit!ELEMENT],

           [SODetail!4!Qty_BY!ELEMENT],

           [SODetail!4!SubAmt_BY!ELEMENT],         

           [SODetail!4!DeliveryDate_BY!ELEMENT],

           [SODetail!4!ItemRemark_BY!ELEMENT]

 

FROM (

  SELECT

           0 as sort,

           1 AS Tag,

           NULL AS Parent,

           NULL AS 'SOMasters!1', -- empty root element

           NULL AS 'SOMaster!2!SendID!ELEMENT',

           NULL AS 'SOMaster!2!ChannelsID!ELEMENT',

           NULL AS 'SOMaster!2!DeliveryLoc!ELEMENT',

           NULL AS 'SOMaster!2!MsgNo!ELEMENT',

           NULL AS 'SOMaster!2!MsgDate!ELEMENT',

           NULL AS 'SOMaster!2!Coin!ELEMENT',

           NULL AS 'SOMaster!2!Amt!ELEMENT',

           NULL AS 'SOMaster!2!Remark!ELEMENT',

           NULL AS 'SOMaster!2!ContactName!ELEMENT',

           NULL AS 'SOMaster!2!ContactTel!ELEMENT',

           NULL AS 'SOMaster!2!ContactAddress!ELEMENT',

           NULL AS 'SODetails!3!ELEMENT',

           NULL AS 'SODetail!4!ItemNo!ELEMENT',

           NULL AS 'SODetail!4!PartNo!ELEMENT',

           NULL AS 'SODetail!4!Unit!ELEMENT',

           NULL AS 'SODetail!4!Qty_BY!ELEMENT',

           NULL AS 'SODetail!4!SubAmt_BY!ELEMENT',       

           NULL AS 'SODetail!4!DeliveryDate_BY!ELEMENT',

           NULL AS 'SODetail!4!ItemRemark_BY!ELEMENT'

         

      UNION ALL

 

      SELECT

           ROW_NUMBER() over(order by ChannelsID)*100 as sort,

           2 AS Tag,

           1 AS Parent,

           NULL

           ,SendID

           ,ChannelsID

           ,DeliveryLoc

           ,MsgNo

           ,MsgDate

           ,Coin

           ,ltrim(Amt)

           ,Remark

           ,ContactName

           ,ContactTel

           ,ContactAddress

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

      FROM

          SOMaster  

 

       UNION ALL

 

         SELECT

           ROW_NUMBER() over(order by ChannelsID)*100+1 as sort,

           3 AS Tag,

           2 AS Parent,

           NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

         from SOMaster

     

      UNION ALL

 

      SELECT

           dense_rank() over(order by ChannelsID)*100+2 as sort,

           4 AS Tag

           ,3 AS Parent

           , NULL

           ,SendID

           ,ChannelsID

           ,DeliveryLoc

           ,MsgNo

           ,MsgDate

           ,Coin

           ,ltrim(Amt)

           ,Remark

           ,ContactName

           ,ContactTel

           ,ContactAddress

           ,null

           ,ItemNo

           ,PartNo

           ,Unit

           ,ltrim(Qty_BY)

           ,ltrim(SubAmt_BY)

           ,DeliveryDate_BY

           ,ItemRemark_BY

       from  @t

       ) a

      order by sort ,'SODetail!4!ItemNo!ELEMENT',Parent

      FOR XML EXPLICIT

     

 

 

/*

关于上面的排序,我们可以用更简单的办法"hide"指令.HIDE指令和Element一样都是

ElementName!TagNumber!AttributeName!DirectiveDirective的一种.

hide指令可以使XML解析器在生成XML的时候忽略改列.

下面为方法二:

*/

 

 

SELECT

          

           1 AS Tag,

           NULL AS Parent,

           0  as 'SOMasters!1!SORT!hide',

           NULL AS 'SOMasters!1', -- empty root element

           NULL AS 'SOMaster!2!SendID!ELEMENT',

           NULL AS 'SOMaster!2!ChannelsID!ELEMENT',

           NULL AS 'SOMaster!2!DeliveryLoc!ELEMENT',

           NULL AS 'SOMaster!2!MsgNo!ELEMENT',

           NULL AS 'SOMaster!2!MsgDate!ELEMENT',

           NULL AS 'SOMaster!2!Coin!ELEMENT',

           NULL AS 'SOMaster!2!Amt!ELEMENT',

           NULL AS 'SOMaster!2!Remark!ELEMENT',

           NULL AS 'SOMaster!2!ContactName!ELEMENT',

           NULL AS 'SOMaster!2!ContactTel!ELEMENT',

           NULL AS 'SOMaster!2!ContactAddress!ELEMENT',

           NULL AS 'SODetails!3!ELEMENT',

           NULL AS 'SODetail!4!ItemNo!ELEMENT',

           NULL AS 'SODetail!4!PartNo!ELEMENT',

           NULL AS 'SODetail!4!Unit!ELEMENT',

           NULL AS 'SODetail!4!Qty_BY!ELEMENT',

           NULL AS 'SODetail!4!SubAmt_BY!ELEMENT',       

           NULL AS 'SODetail!4!DeliveryDate_BY!ELEMENT',

           NULL AS 'SODetail!4!ItemRemark_BY!ELEMENT'

         

      UNION ALL

 

      SELECT

          

           2 AS Tag,

           1 AS Parent,

           ROW_NUMBER() over(order by ChannelsID)*100,

           NULL

           ,SendID

           ,ChannelsID

           ,DeliveryLoc

           ,MsgNo

           ,MsgDate

           ,Coin

           ,ltrim(Amt)

           ,Remark

           ,ContactName

           ,ContactTel

           ,ContactAddress

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

      FROM

          SOMaster  

 

       UNION ALL

 

         SELECT

          

           3 AS Tag,

           2 AS Parent,

           ROW_NUMBER() over(order by ChannelsID)*100+1 ,

           NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

           ,NULL

         from SOMaster

     

      UNION ALL

 

      SELECT

          

           4 AS Tag,

           3 AS Parent,

           dense_rank() over(order by ChannelsID)*100+2

           , NULL

           ,SendID

           ,ChannelsID

           ,DeliveryLoc

           ,MsgNo

           ,MsgDate

           ,Coin

           ,ltrim(Amt)

           ,Remark

           ,ContactName

           ,ContactTel

           ,ContactAddress

           ,null

           ,ItemNo

           ,PartNo

           ,Unit

           ,ltrim(Qty_BY)

           ,ltrim(SubAmt_BY)

           ,DeliveryDate_BY

           ,ItemRemark_BY

       from  @t

      order by  'SOMasters!1!SORT!hide','SODetail!4!ItemNo!ELEMENT',Parent

      FOR XML EXPLICIT

     

/*

<SOMasters>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>330A0000</ChannelsID>

    <DeliveryLoc>无锡巷号</DeliveryLoc>

    <MsgNo>3410052400009811</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(无锡仓)</Remark>

    <ContactName>刘明</ContactName>

    <ContactTel>13556239865</ContactTel>

    <ContactAddress>无锡号</ContactAddress>

    <SODetails>

      <SODetail>

        <ItemNo>1</ItemNo>

        <PartNo>01000188</PartNo>

        <Unit></Unit>

        <Qty_BY>3</Qty_BY>

        <SubAmt_BY>0</SubAmt_BY>

        <DeliveryDate_BY>2010-05-24T10:37:17</DeliveryDate_BY>

        <ItemRemark_BY></ItemRemark_BY>

      </SODetail>

      <SODetail>

        <ItemNo>2</ItemNo>

        <PartNo>01000189</PartNo>

        <Unit></Unit>

        <Qty_BY>7</Qty_BY>

        <SubAmt_BY>0</SubAmt_BY>

        <DeliveryDate_BY>2010-05-24T10:37:17</DeliveryDate_BY>

        <ItemRemark_BY></ItemRemark_BY>

      </SODetail>

    </SODetails>

  </SOMaster>

  <SOMaster>

    <SendID></SendID>

    <ChannelsID>34010019</ChannelsID>

    <DeliveryLoc>南京北路号</DeliveryLoc>

    <MsgNo>3410052400009808</MsgNo>

    <MsgDate>2010-05-24T10:33:18</MsgDate>

    <Coin>RMB</Coin>

    <Amt>0</Amt>

    <Remark>测试接口(南京仓)</Remark>

    <ContactName>刘明</ContactName>

    <ContactTel>13556239865</ContactTel>

    <ContactAddress>南京北路号</ContactAddress>

    <SODetails>

      <SODetail>

        <ItemNo>1</ItemNo>

        <PartNo>01000188</PartNo>

        <Unit></Unit>

        <Qty_BY>6</Qty_BY>

        <SubAmt_BY>0</SubAmt_BY>

        <DeliveryDate_BY>2010-05-24T10:37:17</DeliveryDate_BY>

        <ItemRemark_BY></ItemRemark_BY>

      </SODetail>

      <SODetail>

        <ItemNo>2</ItemNo>

        <PartNo>01000189</PartNo>

        <Unit></Unit>

        <Qty_BY>4</Qty_BY>

        <SubAmt_BY>0</SubAmt_BY>

        <DeliveryDate_BY>2010-05-24T10:37:17</DeliveryDate_BY>

        <ItemRemark_BY></ItemRemark_BY>

      </SODetail>

    </SODetails>

  </SOMaster>

</SOMasters>

 

*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值