domingo, 31 de julio de 2011

FOR XML PATH (SQL Server)

En más de una ocasión he necesitado concatenar el resultado de una consulta en un único campo/registro. Son los casos (por ejemplo) en los que listas las fichas de productos y quieres mostrar en un único campo del registro el historial de cambios realizados.

Para hacer esto SQL Server lo permite de forma fácil mediante la utilización de la cláusula FOR XML PATH en el SELECT. En principio la finalidad de esta cláusula es para generar un XML con el resultado de una consulta pero como podréis ver, le podemos encontrar más utilidades.

Incluyo a continuación un ejemplo de consulta en la que en un único campo/registro recupero el historial de cambios realizados sobre la ficha de un producto.


SELECT HIST_CAMBIOS
  FROM (SELECT (SELECT CONVERT(VARCHAR(MAX), fecha, 3) + 
                       ' - ' +  
                       ISNULL(Name + ' (' + cod_usuario + ')',  
                              cod_usuario) + 
                       ' - Coste anterior: ' +  
                       CAST(ultcos_old AS VARCHAR(MAX)) +
                       ' - Coste asignado: ' +  
                       CAST(ultcos_new AS VARCHAR(MAX)) +
                       ' - Motivo: ' + motivo + '\\' 
          FROM pro02e_ultcos_hist_cambios 
               RIGHT OUTER JOIN dbo.AD_USUARIOS_INYCOM  
               ON cod_usuario = samAccountName
         WHERE emp_pro02e = 'IYC' AND
               codalm_pro02e = 'ZA' AND
               codpro_pro02e = 'PRODTEST'
      ORDER BY fecha DESC
               FOR XML PATH('')) AS HIST_CAMBIOS
        ) TABLA

Y el resultado:

HIST_CAMBIOS

29/07/11 - Usuario (007) - Coste anterior: 2.000 - Coste asignado: 3.000 - Motivo: TEST 3\\29/07/11 - Usuario (007) - Coste anterior: 1.000 - Coste asignado: 2.000 - Motivo: TEST 1\\29/07/11 - Usuario (007) - Coste anterior: 0.00

(1 filas afectadas)

No hay comentarios:

Publicar un comentario