2012-02-03 42 views
0

我有这些表:XML查询标签自带堆叠代替嵌套

TIPO

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

GRUPO

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

PRODUTO

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”根据嵌套。

我在做什么错?

+0

它可能有助于看没有xml的结果集。我怀疑联盟所有的。 – 2012-02-03 20:58:25

+1

您可以向我们展示**基础表结构并解释如何选择将哪些数据转换为XML格式?这将比试图找出如何重新构建糟糕的'FOR XML EXPLICIT'构造更加容易...... – 2012-02-03 22:01:36

+0

@marc_s添加了底层表。我的不好首先不加。让它成为一个教训。 – 2012-02-06 13:07:12

回答

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结构 - 绝对比凌乱,不知所云​​构建我们以前更容易了一大堆.....

+0

非常有趣,但并不完全符合预期,因为TIPO和GRUPO和PRODUTO不是嵌套的,而是对每个PRODUTO重复TIPO和GRUPO。 – 2012-02-06 19:32:14