CONCATENAR USANDO FOR XML PATH Y STUFF
2013/04/16 15:37:00 sergio sanchez arias
En el foro de SQL SERVER se cuestiona mucho como concatenar varias filas en una sola,
sobre todo esto se utiliza para evitar el uso de los cursores y es mucho más rápido, para
comenzar es necesario la tabla AdventureWorks2012.
1 SELECT TOP 10 FirstName
2 FROM AdventureWorks2012.Person.Person
Hasta aquí no hay nada, digámoslo de cierta forma, nuevo, pero para poder hacer la
concatenación requerimos de la función STUFF y la clausula FOR XML utilizando el
modo PATH.
La función STUFF sirve para ingresar una cadena en otra a partir de los parámetros de
posición y longitud. Siendo de esta manera, el siguiente ejemplo:
1 SELECT TOP 10 FirstName, STUFF( FirstName, 3,2,'CADENA') as resultado
2 FROM AdventureWorks2012.Person.Person
Lo que nos arroja como resultado:
Y para que funciona FOR XML PATH , para devolver una consulta en formato XML, este
es el resultado de una consulta a la base de datos AdventureWorks2012:
1 SELECT TOP 3 FirstName, MiddleName, LastName LastName
2 FROM AdventureWorks2012.Person.Person
3 FOR XML PATH
Y si damos click al resultado, nos muestra esto:
Si agregamos el parámetro, reemplazara el atributo de fila:
1 SELECT TOP 3 FirstName, MiddleName, LastName LastName
2 FROM AdventureWorks2012.Person.Person
3 FOR XML PATH('FILA')
Y que pasa si establecemos un valor vacío?:
Combinando STUFF y FOR XML PATH, podemos lograr concatenar las filas.
1 SELECT STUFF((
2 SELECT TOP 10 ','+FirstName
3 FROM AdventureWorks2012.Person.Person
4 FOR XML PATH('')
5 ),1,1, '')
Y de esta manera es posible agrupar a un nivel superior:
1 SELECT
2 PC.Name
3 ,STUFF((
4 SELECT ','+name
5 FROM Production.ProductSubcategory PSC
6 WHERE PSC.ProductCategoryID = PC.ProductCategoryID
7 FOR XML PATH('')
8 ),1,1,'')
9 FROM Production.ProductCategory PC
Algo más complejo, observemos las
tablas Sales.SpecialOffer, Sales.SpecialOfferProduct,Production.Product, la primera
contiene las ofertas especiales( como su nombre lo indica), la segunda tabla contiene el
detallado de los productos que por cada oferta especial y la tercera el detallado de los
productos. Lo que queremos obtener es todos los productos de cada oferta especial:
Sales.SpecialOffer:
Sales.SpecialOfferProduct:
Production.Product
La consulta quedaría así:
01 SELECT SO.SpecialOfferID, SO.Description
02 , STUFF((
03 SELECT ','+p.Name
04 FROM sales.SpecialOfferProduct SOP
05 INNER JOIN Production.Product P
06 ON SOP.ProductID = p.ProductID
07 AND SOP.SpecialOfferID = SO.SpecialOfferID
08 FOR XML PATH('')
09 ),1,1,'' ) as productos
10 FROM Sales.SpecialOffer SO
Una forma muy practica y mucho mejor para concatenar valores en comparación que si
utilizaramos un cursor.
Espero que les sirva.
http://chancrovsky.blogspot.pe/2013/04/concatenar-usando-for-xml-path-y-stuff.html