in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

Trasformazione da XML a recordset

Last post 07-19-2008 19.47 by dmauri. 2 replies.
Page 1 of 1 (3 items)
Sort Posts: Previous Next
  • 07-16-2008 14.16

    Trasformazione da XML a recordset

     

    Salve a tutti,

    ho un problema di questo genere.

    Ho un campo XML..supponiamo questo

     

    <Record>

      <Campo1>XXXX</Campo1>

      <Data>20070104 08:00:00:000</Data>

      <CampoLiberoAltro1 />

      <CampoLiberoAltro2 />

      <CampoLiberoAltro3 />

      <CampoLiberoAltro4 />

      <CampoLiberoAltro5 />

      <Destinatario>MARIO ROSSI</Destinatario>

      <Destinatario_Via>VIA PETRARCA,12</Destinatario_Via>

      <Destinatario_NumeroCivico />

      <Destinatario_Localita>MILANO</Destinatario_Localita>

      <Destinatario_CAP>20100</Destinatario_CAP>

      <Destinatario_Provincia>MI</Destinatario_Provincia>

    </Record>

     

    Che vorrei, tramite un comando TSQL trasformare in una recordset del tipo

    Nome, Valore dove nome è il nome del nodo XML e Valore è il contenuto del nodo

    Ad esempio che per l'esempio di prima otterrei

     

    CAMPO

    VALORE

    Campo1

    XXX

    Data

    20070104 08:00:00:00.000

    CampoLiberoAltro1

     

    CampoLiberoAltro2

     

    CampoLiberoAltro3

     

    CampoLiberoAltro4

     

    CampoLiberoAltro5

     

    Destinatario

    MARIO ROSSI

    Destinatario_Via

    VIA PETRARCA,12

    Destinatario_NumeroCivico

     

    Destinatario_Localita

    MILANO

    Destinatario_Cap

    20100

    Destinatario_Provincia

    MI

     

    La cosa si complica perché io non so quanti e quali campi si trovano come sottonodi di <Record> e non conosco nemmeno il loro nome.

    Ad Esempio potrei ricevere

    <Record>

      <id>123</id>

      <Codice>Cod123</Codice>

      <Descrizione>Descrizione del codice 123</Descrizione>

    </Record> 

    Credo che si possa fare qualcosa con XQuery ma i miei primi tentativi non hanno ottenuto molti successi.

     

    Qualcuno mi sa aiutare in qualche modo

     

    Grazie

    Luca

    • Post Points: 5
  • 07-16-2008 15.28 In reply to

    Re: Trasformazione da XML a recordset

    Ho trovato la soluzione basandomi sull'articolo negli script Importazione dati da file XML a tabella SQL Server (http://www.ugiss.org/Content/Article/Importazione-dati-da-file-XML-a-tabella-SQL-Server.aspx) di Sergio Govoni

    DECLARE @hDoc int

    begin try

    drop table #tmp

    end try

    begin catch

    end catch

    CREATE TABLE #tmp

    (id int,

    Nome varchar(300),

    valore ntext)

     

    EXEC sp_xml_preparedocument @hDoc OUTPUT, @Record

    truncate table #tmp

    INSERT INTO #tmp(id, nome)

    SELECT id, localname

    FROM OPENXML(@hDOC, '/Record', 2)

    WHERE nodetype in (1) and not parentid is null

    update #tmp set

    Valore = XX.text

    from #tmp tt

    inner join (

    SELECT parentid, text

    FROM OPENXML(@hDOC, '/Record', 2)

    WHERE nodetype in (3) and not parentid is null

    ) AS XX ON XX.ParentId = TT.Id

     

    EXEC sp_xml_removedocument @hDoc

    select * from #tmp

     

     

    • Post Points: 20
  • 07-19-2008 19.47 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.076
    • Points 14.150

    Re: Trasformazione da XML a recordset

    Ciao

    con XQuery puoi utilizzare la funzione "local-name()":

    declare @x xml;
    set @x = '<Record>
      <Campo1>XXXX</Campo1>
      <Data>20070104 08:00:00:000</Data>
      <CampoLiberoAltro1 />
      <CampoLiberoAltro2 />
      <CampoLiberoAltro3 />
      <CampoLiberoAltro4 />
      <CampoLiberoAltro5 />
      <Destinatario>MARIO ROSSI</Destinatario>
      <Destinatario_Via>VIA PETRARCA,12</Destinatario_Via>
      <Destinatario_NumeroCivico />
      <Destinatario_Localita>MILANO</Destinatario_Localita>
      <Destinatario_CAP>20100</Destinatario_CAP>
      <Destinatario_Provincia>MI</Destinatario_Provincia>
    </Record>'

    select
     Campo = T.c.value('local-name(.)', 'varchar(max)'),
     Valore = T.c.value('.', 'varchar(max)')
    from
     @x.nodes('/Record/*') T(c)

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 5
Page 1 of 1 (3 items)
(C) 2007 User Group Italiano di SQL Server