none
LEER VALORES DE CAMPO TIPO XML RRS feed

  • Pregunta

  • Que tal comunidad, buen día
    Me puede ayudar por favor on lo siguiente:

    Tengo una tabla con un campo tipo XML, donde el valor del campo datosXML es el siguiente:

     <objetoRespuesta>
        <codigoRespuesta>02</codigoRespuesta>
        <folioRechazo>25621823747265222222</folioRechazo>
        <motivo>
          <motivoRechazo>56</motivoRechazo>
          <motivoRechazo>048</motivoRechazo>
          <motivoRechazo>041</motivoRechazo>
        </motivo>
     </objetoRespuesta>

    Necesito obtener los valores de motivoRechazo de la sección de motivo y concatenarlos en un solo valor
    por ejemplo:
    56|048|041
    Pueden existir 1,2,3 o N elementos en la sección de motivo.

    Me pueden ayudar por favor

    Saludos...

    domingo, 26 de agosto de 2018 16:53

Respuestas

  • Hola:

    La manera más fácil de realizar esto puede ser tal que así:

    declare @xml xml = '<objetoRespuesta>
         <codigoRespuesta>02</codigoRespuesta>
         <folioRechazo>25621823747265222222</folioRechazo>
         <motivo>
           <motivoRechazo>56</motivoRechazo>
           <motivoRechazo>048</motivoRechazo>
           <motivoRechazo>041</motivoRechazo>
         </motivo>
      </objetoRespuesta>';
    
    WITH CTE
         AS (
         SELECT REPLACE(
    			( SELECT CAST(@xml.query('/objetoRespuesta/motivo/motivoRechazo') AS NVARCHAR(MAX))
    			), '<motivoRechazo>', '') AS DATO /*extraemos el principio del xml */
    		)
         SELECT SUBSTRING(REPLACE(C.DATO, '</motivoRechazo>', '|'), 0, LEN(REPLACE(C.DATO, '</motivoRechazo>', '|'))) /*extraemos el cierre del xml y le
    	 restamos un caracter para que la ultima salida no sea | */
         FROM CTE C;
    

    Espero te sirva.

    Un saludo

    • Marcado como respuesta EDPROY martes, 28 de agosto de 2018 3:02
    lunes, 27 de agosto de 2018 18:47

Todas las respuestas

  • Hola:

    La manera más fácil de realizar esto puede ser tal que así:

    declare @xml xml = '<objetoRespuesta>
         <codigoRespuesta>02</codigoRespuesta>
         <folioRechazo>25621823747265222222</folioRechazo>
         <motivo>
           <motivoRechazo>56</motivoRechazo>
           <motivoRechazo>048</motivoRechazo>
           <motivoRechazo>041</motivoRechazo>
         </motivo>
      </objetoRespuesta>';
    
    WITH CTE
         AS (
         SELECT REPLACE(
    			( SELECT CAST(@xml.query('/objetoRespuesta/motivo/motivoRechazo') AS NVARCHAR(MAX))
    			), '<motivoRechazo>', '') AS DATO /*extraemos el principio del xml */
    		)
         SELECT SUBSTRING(REPLACE(C.DATO, '</motivoRechazo>', '|'), 0, LEN(REPLACE(C.DATO, '</motivoRechazo>', '|'))) /*extraemos el cierre del xml y le
    	 restamos un caracter para que la ultima salida no sea | */
         FROM CTE C;
    

    Espero te sirva.

    Un saludo

    • Marcado como respuesta EDPROY martes, 28 de agosto de 2018 3:02
    lunes, 27 de agosto de 2018 18:47
  • Gracias, me resulto de mucha utilidad
    Saludos...
    martes, 28 de agosto de 2018 3:02
  • Aca te dejo otra opcion que usa XML PATH para formar la lista.  Si usas SQL Server 2017 entonces puedes armar la lista usando la funcion STRING_AGG.

    declare @xml xml = '<objetoRespuesta>
         <codigoRespuesta>02</codigoRespuesta>
         <folioRechazo>25621823747265222222</folioRechazo>
         <motivo>
           <motivoRechazo>56</motivoRechazo>
           <motivoRechazo>048</motivoRechazo>
           <motivoRechazo>041</motivoRechazo>
         </motivo>
      </objetoRespuesta>';
    
    SELECT
    	STUFF(
    	(
    	SELECT
    		',' + col1.value('text()[1]', 'varchar(10)') AS [*]
    	FROM
    		@xml.nodes('/objetoRespuesta/motivo/motivoRechazo') AS T(col1)
    	ORDER BY
    		ROW_NUMBER() OVER(ORDER BY T.col1)
    	FOR XML PATH(''), TYPE
    	).value('text()[1]', 'varchar(max)')
    	, 1, 1, '') AS motivoRechazos;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    martes, 28 de agosto de 2018 12:33