AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 191097
Accepted
V_immo
V_immo
Asked: 2017-11-17 12:36:16 +0800 CST2017-11-17 12:36:16 +0800 CST 2017-11-17 12:36:16 +0800 CST

Mesclar duas saídas XML para uma da consulta SQL

  • 772

Eu tenho o seguinte código desenvolvendo 2 arquivos XML, mas gostaria que eles estivessem em um arquivo com várias tags de organização.

SELECT 
LTRIM(RTRIM(c1.cptname)) as "orgHeader/orgCode",
LTRIM(RTRIM(c1.cptname)) as "orgHeader/longName",
LTRIM(RTRIM(c1.cptname)) as "orgHeader/shortName",
'Branch' as "orgRole",
(
SELECT system, extCode from
(
    Select 'a' AS 'system', LTRIM(RTRIM(c1.cptname)) AS 
   'extCode'
    UNION ALL 
    Select 'b' AS 'system', LTRIM(RTRIM(c1.cptname)) AS 
   'extCode'
    UNION ALL 
    Select 'Manual' AS 'system', LTRIM(RTRIM(c1.cptname)) AS 
   'extCode'
) a
FOR XML PATH('externalCode'), TYPE, ELEMENTS,Root('externalCodes')
)
from  cpt c1
where cptleagname like '%abc%'
and cptcod IN (select cptcod from pf_map
where pf IN ('abc','abc-jp')
and stat = 'a')

FOR XML PATH('organisation'), root ('collection')

SELECT 
LTRIM(RTRIM(c1.cptname))+'.' as "orgHeader/orgCode",
LTRIM(RTRIM(c1.cptname))+'.' as "orgHeader/longName",
LTRIM(RTRIM(c1.cptname))+'.' as "orgHeader/shortName",
(
SELECT orgRole from
(
    Select 'Coll' AS 'orgRole'
    UNION ALL 
    Select 'Lega' AS 'orgRole'
) a
FOR XML PATH(''), TYPE, ELEMENTS
)
from  cpt c1
where cptleagname like '%abc%'
and cptcod IN (select cptcod from pf_map
where pf IN ('abc','abc-jp')
and stat = 'a')

FOR XML PATH('organisation'), root ('collection')

Quando eu executo isso, ele produz 2 arquivos XML como saída como abaixo.

<collection>
 <organisation>
   <orgHeader>
    <orgCode>abc</orgCode>
    <longName>abc</longName>
    <shortName>abc</shortName>
   </orgHeader>
   <orgRole>Branch</orgRole>
   <externalCodes>
    <externalCode>
      <system>a</system>
      <extCode>abc</extCode>
    </externalCode>
    <externalCode>
      <system>b</system>
      <extCode>abc</extCode>
    </externalCode>
    <externalCode>
      <system>Manual</system>
      <extCode>abc</extCode>
    </externalCode>
  </externalCodes>
</organisation>

E

<collection>
 <organisation>
   <orgHeader>
     <orgCode>abc.</orgCode>
     <longName>abc.</longName>
     <shortName>abc.</shortName>
   </orgHeader>
   <orgRole>Coll</orgRole>
   <orgRole>Leg</orgRole>
 </organisation>
</collection>

Embora eu queira adicioná-lo em um único arquivo para produzir resultados como Coleção como raiz e mesclar esses arquivos na marca da organização da seguinte maneira.

 <collection>
  <organisation>
   <orgHeader>
    <orgCode>abc</orgCode>
    <longName>abc</longName>
    <shortName>abc</shortName>
   </orgHeader>
   <orgRole>Branch</orgRole>
   <externalCodes>
    <externalCode>
      <system>a</system>
      <extCode>abc</extCode>
    </externalCode>
    <externalCode>
      <system>b</system>
      <extCode>abc</extCode>
    </externalCode>
    <externalCode>
      <system>Manual</system>
      <extCode>abc</extCode>
    </externalCode>
   </externalCodes>
  </organisation>
  <organisation>
   <orgHeader>
     <orgCode>abc.</orgCode>
     <longName>abc.</longName>
     <shortName>abc.</shortName>
   </orgHeader>
   <orgRole>Coll</orgRole>
   <orgRole>Leg</orgRole>
 </organisation>
</collection>

Por favor, comente abaixo se qualquer outra informação for necessária. Obrigado.

sql-server-2008 xml
  • 1 1 respostas
  • 6650 Views

1 respostas

  • Voted
  1. Best Answer
    Sabin B
    2017-11-17T23:35:55+08:002017-11-17T23:35:55+08:00

    Algo próximo da saída desejada:

    ;with cpt
    AS 
    (
           Select 'abc' as cptname
    )
    ,sys
    AS
    (
          Select 'a' as "system"
          union all Select 'b' as "system"
          union all Select 'Manual' as "system"
    )
    ,org
    AS
    (
          Select 'Coll' AS "orgRole"
          union all Select 'Lega'
    )
    
    SELECT 
    LTRIM(RTRIM(c1.cptname)) as "orgHeader/orgCode",
    LTRIM(RTRIM(c1.cptname)) as "orgHeader/longName",
    LTRIM(RTRIM(c1.cptname)) as "orgHeader/shortName",
    'Branch' as "orgRole",
    s."externalCodes"
    FROM
       cpt as c1
       CROSS APPLY
       (SELECT 
            s."system" as "externalCode/system",
            LTRIM(RTRIM(c1.cptname)) as "externalCode/extCode"
        FROM sys as s
        FOR XML PATH(''), TYPE, ELEMENTS
        )s(externalCodes)
    
    UNION ALL
    
    SELECT
    LTRIM(RTRIM(c1.cptname)) +'.' as "orgHeader/orgCode",
    LTRIM(RTRIM(c1.cptname)) +'.' as "orgHeader/longName",
    LTRIM(RTRIM(c1.cptname)) +'.' as "corgHeader/shortName",
    o.orgRole as "orgRole",
    null 
    FROM
       cpt as c1
       CROSS APPLY
       (SELECT org.orgRole 
         FROM org
         FOR XML PATH(''), TYPE, ELEMENTS
       ) as o(orgRole)
    
    FOR XML PATH('organisation'), root ('collection')
    

    saída para ele:

    <collection>
       <organisation>
          <orgHeader>
             <orgCode>abc</orgCode>
             <longName>abc</longName>
             <shortName>abc</shortName>
          </orgHeader>
          <orgRole>Branch</orgRole>
          <externalCodes>
             <externalCode>
                <system>a</system>
                <extCode>abc</extCode>
             </externalCode>
             <externalCode>
                <system>b</system>
                <extCode>abc</extCode>
             </externalCode>
             <externalCode>
                <system>Manual</system>
                <extCode>abc</extCode>
             </externalCode>
          </externalCodes>
       </organisation>
       <organisation>
          <orgHeader>
             <orgCode>abc.</orgCode>
             <longName>abc.</longName>
             <shortName>abc.</shortName>
          </orgHeader>
          <orgRole>
             <orgRole>Coll</orgRole>
             <orgRole>Lega</orgRole>
          </orgRole>
       </organisation>
    </collection>
    

    Você disse que a tag pai orgRoledeve ser removida. Estamos próximos da solução final, mas ainda não chegamos lá. tenho uma ideia comFOR XML EXPLICIT

    ;with cpt
    AS 
    (
           Select 'abc' as cptname
    )
    ,sys
    AS
    (
          Select 'a' as "system"
          union all Select 'b' as "system"
          union all Select 'Manual' as "system"
    )
    ,org
    AS
    (
          Select 'Coll' AS "orgRole"
          union all Select 'Lega'
    )
    ,cte_source
    AS
    (
    SELECT LTRIM(RTRIM(c1.cptname)) as cptname,
    'Branch' as orgRole,
    s.system,
    s.extcode
    FROM
       cpt as c1
       CROSS APPLY
       (SELECT 
            s.system ,
            LTRIM(RTRIM(c1.cptname)) as extCode
        FROM sys as s
        )s(system,extCode)
    
    UNION ALL
    
    SELECT
    LTRIM(RTRIM(c1.cptname)) +'.' ,
    o.orgRole,
    null,
    null
    FROM
       cpt as c1
       CROSS APPLY
       (SELECT org.orgRole 
         FROM org
       ) as o(orgRole)
    )
    
    --select * from cte_source
    
    SELECT 1 as Tag
        ,NULL as Parent
        ,NULL as [collection!1!]
        ,NULL as [organisation!2!]
        ,NULL as [orgHeader!3!]
        ,NULL as [orgHeader!3!orgCode!ELEMENT]
        ,NULL as [orgHeader!3!longName!ELEMENT]
        ,NULL as [orgHeader!3!shortName!ELEMENT]
        ,NULL as [orgRole!4!]
        ,NULL as [externalCodes!5!]
        ,NULL as [externalCode!6!system!ELEMENT]
        ,NULL as [externalCode!6!extCode!ELEMENT]
    
    UNION ALL
    
    -- for organisation
    SELECT DISTINCT
        2 as Tag
        ,1 as Parent
        ,NULL as [collection!1!]
        ,NULL as [organisation!2!]
        ,NULL as [orgHeader!3!]
        ,c.cptname as [orgHeader!3!orgCode!ELEMENT]
        ,c.cptname as [orgHeader!3!longName!ELEMENT]
        ,c.cptname as [orgHeader!3!shortName!ELEMENT]
        ,NULL as [orgRole!4!] 
        ,NULL as [externalCodes!5!]
        ,NULL as [externalCode!6!system!ELEMENT]
        ,NULL as [externalCode!6!extCode!ELEMENT]
    FROM
      cte_source as c
    
    UNION ALL
    
    --for orgHeader
    SELECT DISTINCT
        3 as Tag
        ,2 as Parent
        ,NULL as [collection!1!]
        ,NULL as [organisation!2!]
        ,NULL as [orgHeader!3!]
        ,c.cptname as [orgHeader!3!orgCode!ELEMENT]
        ,c.cptname as [orgHeader!3!longName!ELEMENT]
        ,c.cptname as [orgHeader!3!shortName!ELEMENT]
        ,NULL as [orgRole!4!]
        ,NULL as [externalCodes!5!]
        ,NULL as [externalCode!6!system!ELEMENT]
        ,NULL as [externalCode!6!extCode!ELEMENT]
    FROM
      cte_source as c
    
    
    UNION ALL
    
    --for orgRole
    SELECT DISTINCT
        4 as Tag
        ,2 as Parent
        ,NULL as [collection!1!]
        ,NULL as [organisation!2!]
        ,NULL as [orgHeader!3!]
        ,c.cptname as [orgHeader!3!orgCode!ELEMENT]
        ,c.cptname as [orgHeader!3!longName!ELEMENT]
        ,c.cptname as [orgHeader!3!shortName!ELEMENT]
        ,c.orgRole as [orgRole!4!]
        ,NULL as [externalCodes!5!]
        ,NULL as [externalCode!6!system!ELEMENT]
        ,NULL as [externalCode!6!extCode!ELEMENT]
    FROM
      cte_source as c
    
    
    UNION ALL
    
    --for externalCodes
    SELECT DISTINCT
        5 as Tag
        ,2 as Parent
        ,NULL as [collection!1!]
        ,NULL as [organisation!2!]
        ,NULL as [orgHeader!3!]
        ,c.cptname  as [orgHeader!3!orgCode!ELEMENT]
        ,c.cptname as [orgHeader!3!longName!ELEMENT]
        ,c.cptname as [orgHeader!3!shortName!ELEMENT]
        ,NULL as [orgRole!4!]
        ,NULL as [externalCodes!5!]
        ,NULL as [externalCode!6!system!ELEMENT]
        ,NULL as [externalCode!6!extCode!ELEMENT]
    FROM
      cte_source as c
    
    
    UNION ALL
    
    --for externalCode
    SELECT DISTINCT
        6 as Tag
        ,5 as Parent
        ,NULL as [collection!1!]
        ,NULL as [organisation!2!]
        ,NULL as [orgHeader!3!]
        ,c.cptname as [orgHeader!3!orgCode!ELEMENT]
        ,c.cptname as [orgHeader!3!longName!ELEMENT]
        ,c.cptname as [orgHeader!3!shortName!ELEMENT]
        ,NULL as [orgRole!4!]
        ,NULL as [externalCodes!5!]
        ,c.system as [externalCode!6!system!ELEMENT]
        ,c.extCode as [externalCode!6!extCode!ELEMENT]
    FROM
      cte_source as c
    
    
    ORDER BY 
        [organisation!2!]
        ,[orgHeader!3!orgCode!ELEMENT]
        --,[orgRole!4!]
        ,[externalCode!6!system!ELEMENT]
        ,[externalCode!6!extCode!ELEMENT]
    
    FOR XML EXPLICIT
    

    a saída para ele:

    <collection>
      <organisation>
        <orgHeader>
          <orgCode>abc</orgCode>
          <longName>abc</longName>
          <shortName>abc</shortName>
        </orgHeader>
        <orgRole>Branch</orgRole>
        <externalCodes>
          <externalCode>
            <system>a</system>
            <extCode>abc</extCode>
          </externalCode>
          <externalCode>
            <system>b</system>
            <extCode>abc</extCode>
          </externalCode>
          <externalCode>
            <system>Manual</system>
            <extCode>abc</extCode>
          </externalCode>
        </externalCodes>
      </organisation>
      <organisation>
        <orgHeader>
          <orgCode>abc.</orgCode>
          <longName>abc.</longName>
          <shortName>abc.</shortName>
        </orgHeader>
        <orgRole>Coll</orgRole>
        <orgRole>Lega</orgRole>
        <externalCodes>
          <externalCode />
        </externalCodes>
      </organisation>
    </collection>
    

    uma pequena observação: externalCodes/externalCodeainda aparece (com null) quando temos valores nulos nas colunas correspondentes.

    You can use two variables : one to store the first part of the xml and one to store the second part; then add as prefix <collection> and a suffix `'

    declare @cpt table
    ( 
        cptname varchar(10)
    )
    insert into @cpt(cptname)
    values('abc')
    
    declare @sys table
    (
        system varchar(10)
    )
    insert into @sys(system)
    values('a'),('b'),('Manual')
    
    
    declare @org table
    (
        orgRole varchar(10)
    )
    insert into @org(orgRole)
    values('Coll'),('Lega')
    
    declare @nvc_o1 nvarchar(max)=N''
         ,@nvc_o2 nvarchar(max)=N''
    
    
    SET @nvc_o1 = (
    
    SELECT 
    LTRIM(RTRIM(c1.cptname)) as "orgHeader/orgCode",
    LTRIM(RTRIM(c1.cptname)) as "orgHeader/longName",
    LTRIM(RTRIM(c1.cptname)) as "orgHeader/shortName",
    'Branch' as "orgRole",
    (
    SELECT system, extCode from
    (
        Select 'a' AS 'system', LTRIM(RTRIM(c1.cptname)) AS 
       'extCode'
        UNION ALL 
        Select 'b' AS 'system', LTRIM(RTRIM(c1.cptname)) AS 
       'extCode'
        UNION ALL 
        Select 'Manual' AS 'system', LTRIM(RTRIM(c1.cptname)) AS 
       'extCode'
    ) a
    FOR XML PATH('externalCode'), TYPE, ELEMENTS,Root('externalCodes')
    )
    from  @cpt as c1
    FOR XML PATH(''), root ('organisation')
    )
    
    SET @nvc_o2 = (
    SELECT 
    LTRIM(RTRIM(c1.cptname))+'.' as "orgHeader/orgCode",
    LTRIM(RTRIM(c1.cptname))+'.' as "orgHeader/longName",
    LTRIM(RTRIM(c1.cptname))+'.' as "orgHeader/shortName",
    (
    SELECT orgRole from @org
    FOR XML PATH(''), TYPE, ELEMENTS
    )
    from  @cpt as c1
    FOR XML PATH(''), root ('organisation')
    )
    
    select CAST(N'<collection>' AS NVARCHAR(MAX))
    + @nvc_o1
    + @nvc_o2
    + CAST(N'</collection>' AS NVARCHAR(MAX))
    

    output of this:

    <collection>
       <organisation>
          <orgHeader>
             <orgCode>abc</orgCode>
             <longName>abc</longName>
             <shortName>abc</shortName>
          </orgHeader>
          <orgRole>Branch</orgRole>
          <externalCodes>
             <externalCode>
                <system>a</system>
                <extCode>abc</extCode>
             </externalCode>
             <externalCode>
                <system>b</system>
                <extCode>abc</extCode>
             </externalCode>
             <externalCode>
                <system>Manual</system>
                <extCode>abc</extCode>
             </externalCode>
          </externalCodes>
       </organisation>
       <organisation>
          <orgHeader>
             <orgCode>abc.</orgCode>
             <longName>abc.</longName>
             <shortName>abc.</shortName>
          </orgHeader>
          <orgRole>Coll</orgRole>
          <orgRole>Lega</orgRole>
       </organisation>
    </collection>
    

    dbfiddle here

    LATER ADDED

    to export with bcp: [test].[dbo].[test_xml] it is a stored procedure where you will place your code inside.

    declare @sql nvarchar(4000) 
    select @sql  = N'bcp.exe "EXEC [test].[dbo].[test_xml]" queryout "d:\csv\comm.txt" -c -t, -T -S'+ @@servername 
    exec master..xp_cmdshell @sql
    
    • 1

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve