Un truco práctico de XML Path en SQL Server

Un truco práctico de XML Path en SQL Server

En mi experiencia profesional desde la primera vez que SQL Server introdujo el uso de funciones para la gestión de tipos de datos XML no había encontrado en mis tareas rutinarias la oportunidad de llevar a cabo un uso práctico de sus potencialidades, sin embargo hay una excepción que corresponde al uso de XML Path, en este enlace hay una explicación detallada de su uso:

https://msdn.microsoft.com/es-es/library/bb510462(v=sql.120).aspx

Pero en breves palabras lo que requería era poder concatenar las filas de una columna

2016-02-24_22-39-10

Para obtener el siguiente resultado: Nicaragua,España,Colombia, Argentina,Cuba

Comenzamos con la creación del script para la definición de nuestra tabla de prueba:

DECLARE @Pais AS TABLE
    (
      ID INT IDENTITY
             NOT NULL ,
      Country NVARCHAR(75)
    );

INSERT  INTO @Pais
        ( Country )
VALUES  ( N'Nicaragua'),
        ( N'España'),
        ( N'Colombia'),
        ( N'Argentina'),
        ( N'Cuba' );

La sintaxis FOR XML PATH se anexa al final de nuestra consulta como en el siguiente ejemplo:

SELECT ',' + Country 
FROM @Pais
FOR XML PATH('')

El resultado que obtenemos es parcialmente el deseado, ya que nos retona el siguiente resultado:

resultado

Sin embargo requerimos eliminar la primera “,” y vamos a utilizar una función idónea para este caso como es STUFF, en este enlace se puede encontrar información detallada del mismo.

https://msdn.microsoft.com/es-es/library/ms188043(v=sql.120).aspx

De manera puntual lo que queremos hacer es reemplazar el valor contenido en una cadena con un valor especifico en una posición y con una longitud determinada, para nuestro caso el valor que quedemos remover es la “,”.

SELECT STUFF((SELECT ',' + Country AS [text()] FROM @Pais FOR XML PATH('')),1,1,'') 
AS Countries;

Con esta sentencia obtenemos el resultado deseado
result2

Es notable ver el uso de [text()], esto nos permite hacer una sobrecarga del alias de la columna, en caso que desees ampliar un poco más podrás encontrar un enlace con este tema a continuación:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/c4d29985-4cef-4811-8d68-c4d3fa9365ca/using-text-directive-with-for-xml-path?forum=sqlxml

Espero te sea de provecho este pequeño artículo. Saludos y Good Code !!!!

Leave a Reply

Your email address will not be published. Required fields are marked *