none
sql xml RRS feed

  • Pregunta

  • hola foro :

     Les queria consultar para ver si me dan una idea como  puedo mejorar la generacion de  xmls desde sql server , y queria saber si se puede hacerlo de una manera mas practica. 
     Explico como lo  hago ,asi me puede decir que les parece y como mejorar (porque ahora se vuelve tedioso la modificacion)

    Para generar los xml parto  de una vista que tiene el select a varias tablas ,luego con esa vista  genero xml de mas o menos con el siguiente script:

     Select *
    From (
    SELECT 1 as Tag,  
    NULL as Parent,
    vwvista 1 as [Novedad!1!CuitProveedor!hide!Element], 
    null as [Cabecera!2!ProveedorNombre!Element], 
    null as [Cabecera!2!TrabajadorApellido!Element], 
    null as [Cabecera!2!TrabajadorNombres!Element], 
    null as [Cabecera!2!TrabajadorCalle!Element],
    null as [Cabecera!2!TrabajadorNumero!Element],
    null as [Cabecera!2!TrabajadorPiso!Element], 
    null as [Cabecera!2!TrabajadorDepartamento!Element],
    null as [Cabecera!2!TrabajadorLocalidad!Element],
    null as [Cabecera!2!TrabajadorProvincia!Element],

    From vwvista
    Where nroproveedor= @nro@  And NroFormulario = @NroFormulario@

    UNION

    SELECT 2 as Tag,
     1 as Parent, 
     NULL AS CuitProveedor  
    ProveedorNombre   ,
    TrabajadorApellido     ,
    TrabajadorNombres     ,
    TrabajadorCalle,
    TrabajadorNumero,
    TrabajadorPiso, 
    TrabajadorDepartamento,
    TrabajadorLocalidad,
    TrabajadorProvincia,

    EmpleadorRazonSocial     ,
    ....

    el xml se genera con dos tag  principales cabecera y alta
    <?xml version="1.0" encoding="utf8"?>
    <Novedad>
     <cabecera>
     <ProveedorNombre>
     jorge s
      </ProveedorNombre>
    ...
     </Cabecera>
    <Alta>
    ..   

    <idnum> 
         </idnum>
    ....
    </Alta>
    </Novedad>

    Esto probe hacer algo  asi , FOR XML PATH('Cabecera'),ROOT('Novedad') pero no me alcanza, el tema es que me falta el tag alta. y los tag dentro del tag alta.
    Que sugerencia podrian hacerme ,porque si tengo que modificar un campo en el script de arriba se vuelve tedioso.


    Gracias

        



    • Editado Inovador2015 sábado, 28 de noviembre de 2015 14:20
    sábado, 28 de noviembre de 2015 7:48

Respuestas

  • Saludos,

    En base a lo que comprendí te adjunto este ejemplo.

    Prueba:

    DECLARE @XML table (
    	ProveedorNombre nvarchar(100),
    	Alta nvarchar(100),
    	idnum int
    );
    
    INSERT INTO @XML
        (ProveedorNombre, Alta, idnum)
    VALUES
        ('Eros','DC',1960),
        ('Eros','DC',9899),
        ('Eros','FR',5560);
    
    WITH R1 AS (
    	SELECT DISTINCT		
    		ProveedorNombre
    	FROM
    		@XML
    	)
    , R2 AS (
    	SELECT DISTINCT	
    		ProveedorNombre,
    		Alta
    	FROM
    		@XML
    	)
    SELECT
        ProveedorNombre AS ProveedorNombre,
        (
        SELECT
            R2.Alta AS Cabecera,
            (
            SELECT
                T.idnum
            FROM
            	@XML AS T
            WHERE
           
                T.ProveedorNombre = R1.ProveedorNombre
                AND T.Alta = R2.Alta
            FOR XML PATH('Alta'), TYPE
            )
        FROM
        	R2
        WHERE      
            R2.ProveedorNombre = R1.ProveedorNombre
        FOR XML PATH(''), ELEMENTS, TYPE
        )
    FROM
    	R1
    FOR XML PATH('Novedad');
    GO

    Salida:

    <Novedad>
      <ProveedorNombre>Eros</ProveedorNombre>
      <Cabecera>DC</Cabecera>
      <Alta>
        <idnum>1960</idnum>
      </Alta>
      <Alta>
        <idnum>9899</idnum>
      </Alta>
      <Cabecera>FR</Cabecera>
      <Alta>
        <idnum>5560</idnum>
      </Alta>
    </Novedad>

    Pregunta si tienes dudas.


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Steve Morrison

    • Editado Nathán XS miércoles, 2 de diciembre de 2015 0:03
    • Marcado como respuesta Inovador2015 miércoles, 2 de diciembre de 2015 3:16
    • Desmarcado como respuesta Inovador2015 miércoles, 2 de diciembre de 2015 3:17
    • Marcado como respuesta Inovador2015 miércoles, 2 de diciembre de 2015 10:47
    miércoles, 2 de diciembre de 2015 0:01

Todas las respuestas

  • Ponnos un ejemplo con datos, con el xml que obtienes y el que deseas. De otra forma es muy complicado ayudarte

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    domingo, 29 de noviembre de 2015 23:01
    Moderador
  • hola miguel , perdon la demora.

    tengo una query que levanta datos de un vista llamada cnc_Proveedor,. que hace select de varias tablas.

    esta query de abajo me genera un xml  a partir de la vista , pero no se si es a manera mas optima , para mi es dificil mantener agregar o quitar campos, para mi debe haber una manera mas simplificada.

    la version que uso es la sql 2005


    gracias



    • Editado Inovador2015 miércoles, 2 de diciembre de 2015 10:49
    martes, 1 de diciembre de 2015 3:35
  • lo que te pedía era algo que pudiéramos probar. yo no tengo la tabla cncinformes_proveedor ni nos comentas que xml te da y que esperas. Es lo que necesitamos para poder ayudarte.

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 1 de diciembre de 2015 17:34
    Moderador
  • Saludos,

    En base a lo que comprendí te adjunto este ejemplo.

    Prueba:

    DECLARE @XML table (
    	ProveedorNombre nvarchar(100),
    	Alta nvarchar(100),
    	idnum int
    );
    
    INSERT INTO @XML
        (ProveedorNombre, Alta, idnum)
    VALUES
        ('Eros','DC',1960),
        ('Eros','DC',9899),
        ('Eros','FR',5560);
    
    WITH R1 AS (
    	SELECT DISTINCT		
    		ProveedorNombre
    	FROM
    		@XML
    	)
    , R2 AS (
    	SELECT DISTINCT	
    		ProveedorNombre,
    		Alta
    	FROM
    		@XML
    	)
    SELECT
        ProveedorNombre AS ProveedorNombre,
        (
        SELECT
            R2.Alta AS Cabecera,
            (
            SELECT
                T.idnum
            FROM
            	@XML AS T
            WHERE
           
                T.ProveedorNombre = R1.ProveedorNombre
                AND T.Alta = R2.Alta
            FOR XML PATH('Alta'), TYPE
            )
        FROM
        	R2
        WHERE      
            R2.ProveedorNombre = R1.ProveedorNombre
        FOR XML PATH(''), ELEMENTS, TYPE
        )
    FROM
    	R1
    FOR XML PATH('Novedad');
    GO

    Salida:

    <Novedad>
      <ProveedorNombre>Eros</ProveedorNombre>
      <Cabecera>DC</Cabecera>
      <Alta>
        <idnum>1960</idnum>
      </Alta>
      <Alta>
        <idnum>9899</idnum>
      </Alta>
      <Cabecera>FR</Cabecera>
      <Alta>
        <idnum>5560</idnum>
      </Alta>
    </Novedad>

    Pregunta si tienes dudas.


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Steve Morrison

    • Editado Nathán XS miércoles, 2 de diciembre de 2015 0:03
    • Marcado como respuesta Inovador2015 miércoles, 2 de diciembre de 2015 3:16
    • Desmarcado como respuesta Inovador2015 miércoles, 2 de diciembre de 2015 3:17
    • Marcado como respuesta Inovador2015 miércoles, 2 de diciembre de 2015 10:47
    miércoles, 2 de diciembre de 2015 0:01