0

我有这些表:

知识产权局

X5_CHAVE    X5_TABELA     X5_DESCRI
--------    ---------     ---------------------
04          02            APOIO DIDATICO 
03          02            PESQUISA E REFERENCIA 

集团

BM_GRUPO     BM_DESC
--------     -----------
01           HISTORIA
05           JORNALISMO
13           PAPEL

产品

COD_ITEM       DSC_ITEM                           PRV_ITEM
----------     ------------------------------     --------
12.13.0001     PAPEL OFF SET 63,5 CM - 63 G           0.00
12.13.0002     PAPEL OFF SET 87 CM - 63 G             0.00
04.05.0001     REFLEXOES SOB A DIFER -2ªED.02        21.00
03.01.0001     BRINQUEDOS DA MEMORIA - 1996          18.00

使用此查询:

SELECT TOP 2
         1 AS TAG
        ,NULL AS PARENT
        ,cast(tipo.X5_DESCRI as varchar(55)) AS "tipo!1!dsc_tipo"
        ,NULL AS "Grupo!2!dsc_grupo"
        ,NULL AS "produto!3!cod_item"
        ,NULL AS "produto!3!dsc_item"
        ,NULL AS "produto!3!prv_item"
FROM SB1020 produto
JOIN SBM020 grupo ON (cast(grupo.BM_GRUPO as char(2)) = cast(substring(produto.B1_COD,4,2) as char(2)))
JOIN SX5020 tipo ON ((cast(tipo.X5_CHAVE as char(2))= cast(substring(produto.B1_COD,1,2) as char(2))) AND (tipo.X5_TABELA = '02'))
UNION ALL
SELECT TOP 2
         2 AS TAG
        ,1 AS PARENT
        ,cast(tipo.X5_DESCRI as varchar(55))
        ,cast(grupo.BM_DESC as varchar(30))
        ,NULL
        ,NULL
        ,NULL
FROM SB1020 produto
JOIN SBM020 grupo ON (cast(grupo.BM_GRUPO as char(2)) = cast(substring(produto.B1_COD,4,2) as char(2)))
JOIN SX5020 tipo ON ((cast(tipo.X5_CHAVE as char(2))= cast(substring(produto.B1_COD,1,2) as char(2))) AND (tipo.X5_TABELA = '02'))
UNION ALL
SELECT TOP 2
         3 AS TAG
        ,2 AS PARENT
        ,cast(tipo.X5_DESCRI as varchar(55))
        ,cast(grupo.BM_DESC as varchar(30))
        ,produto.B1_COD as COD_ITEM
        ,cast(produto.B1_DESC as varchar(30)) AS DSC_ITEM
        ,cast(produto.B1_PRV1 AS decimal (6,2)) as PRV_ITEM
FROM SB1020 produto
JOIN SBM020 grupo ON (cast(grupo.BM_GRUPO as char(2)) = cast(substring(produto.B1_COD,4,2) as char(2)))
JOIN SX5020 tipo ON ((cast(tipo.X5_CHAVE as char(2))= cast(substring(produto.B1_COD,1,2) as char(2))) AND (tipo.X5_TABELA = '02'))

ORDER BY "produto!3!dsc_item","Grupo!2!dsc_grupo","tipo!1!dsc_tipo"

FOR XML EXPLICIT, ROOT('dsc')

这给了我这个:

<dsc>
  <tipo dsc_tipo="MATERIAL DE CONSUMO                                    " />
  <tipo dsc_tipo="MATERIAL DE CONSUMO                                    ">
    <Grupo dsc_grupo="PAPEL                         " />
    <Grupo dsc_grupo="PAPEL                         ">
      <produto cod_item="12.13.0001     " dsc_item="PAPEL OFF SET 63,5 CM - 63 G  " prv_item="0.00" />
      <produto cod_item="12.13.0002     " dsc_item="PAPEL OFF SET 87 CM - 63 G    " prv_item="0.00" />
    </Grupo>
  </tipo>
</dsc>

或者,如果没有 FOR XML,则:

TAG     PARENT     tipo!1!dsc_tipo        Grupo!2!dsc_grupo      produto!3!cod_item       produto!3!dsc_item              produto!3!prv_item
---     ------     ---------------        -----------------      ------------------       ------------------              ------------------
1       NULL       MATERIAL DE CONSUMO    NULL                   NULL                     NULL                             NULL
1       NULL       MATERIAL DE CONSUMO    NULL                   NULL                     NULL                             NULL
2       1          MATERIAL DE CONSUMO    PAPEL                  NULL                     NULL                             NULL
2       1          MATERIAL DE CONSUMO    PAPEL                  NULL                     NULL                             NULL
3       2          MATERIAL DE CONSUMO    PAPEL                  12.13.0001               PAPEL OFF SET 63,5 CM - 63 G     0.00
3       2          MATERIAL DE CONSUMO    PAPEL                  12.13.0002               PAPEL OFF SET 87 CM - 63 G       0.00

随着“tipo”和“grupo”的堆叠和空置。事实上,我想要这个结果:

<dsc>
  <tipo dsc_tipo="MATERIAL DE CONSUMO                                    ">
    <Grupo dsc_grupo="PAPEL                         ">
      <produto cod_item="12.13.0001     " dsc_item="PAPEL OFF SET 63,5 CM - 63 G  " prv_item="0.00" />
      <produto cod_item="12.13.0002     " dsc_item="PAPEL OFF SET 87 CM - 63 G    " prv_item="0.00" />
    </Grupo>
  </tipo>
</dsc>

也就是说,“Tipo”、“Grupo”和“produto”根据 嵌套。

我究竟做错了什么?

4

1 回答 1

2

没有你的数据库表定义,也没有你的数据来测试它,这只是我的想法:

SELECT
   CAST(tipo.X5_DESCRI AS VARCHAR(55)) AS '@dsc_tipo',
   CAST(grupo.BM_DESC AS VARCHAR(30)) AS 'Grupo/@dsc_grupo',
   (SELECT
        produto.B1_COD AS '@cod_item',
        CAST(produto.B1_DESC AS VARCHAR(30)) AS '@dsc_item',
        CAST(produto.B1_PRV1 AS DECIMAL(6,2)) AS '@prv_item'
    WHERE
        CAST(grupo.BM_GRUPO AS CHAR(2)) = CAST(SUBSTRING(produto.B1_COD, 4, 2) AS CHAR(2))
    FOR XML PATH('produto'), TYPE
   ) 
FROM
    dbo.SBM020 grupo 
INNER JOIN 
    dbo.SX5020 tipo ON CAST(tipo.X5_CHAVE AS CHAR(2)) = CAST(SUBSTRING(produto.B1_COD,  1, 2) AS CHAR(2))
                    AND tipo.X5_TABELA = '02'
FOR XML PATH('tipo'), ROOT('dsc')

基本上,有了新的FOR XML PATH结构和嵌套这些 XML 查询的能力,您将获得非常强大且更易于使用的工具来创建即使是最苛刻的 XML 结构 - 绝对比FOR XML EXPLICIT我们之前的凌乱、难以理解的结构要容易得多。 ……

于 2012-02-03T22:16:04.960 回答