É possível utilizar o recurso em T-SQL para que várias linhas retornadas em uma select sejam concatenadas em uma única.
O cenário utilizado foi por exemplo, em impressão de etiquetas, que um produto produzido foi consumido x produtos com y quantidades.
Utilizamos no exemplo o Banco de Dados AdventureWorks2008 do SQL Server, a qual pode ser adaptado facilmente para qualquer versão que voce esteja utilizando.
Select P.Name +' - Tkg '+ SOD.CarrierTrackingNumber +' - Qty '+ CONVERT(VARCHAR, SOD.OrderQty) +' - Prc '+ CONVERT(VARCHAR, SOD.UnitPrice) From Sales.SalesOrderDetail SOD inner join Production.Product P on P.ProductID = SOD.ProductID Where SalesOrderID = 43664
O seguinte resultado irá aparecer, sendo um resiltado simples que já estamos acostumados.
O problema é que o gerador de relatório estava interpretando que cada linha do SQL estava sendo colocado um uma folha. Para isso, precisávamos colocar todas as linhas retornadas em uma única (como se fosse uma única string). Para isso, executamos o seguinte comando:
Select STUFF((SELECT DISTINCT ' ' + P.Name +' - Tkg '+ SOD.CarrierTrackingNumber +' - Qty '+ CONVERT(VARCHAR, SOD.OrderQty) +' - Prc '+ CONVERT(VARCHAR, SOD.UnitPrice) + CHAR(10) From Sales.SalesOrderDetail SOD inner join Production.Product P on P.ProductID = SOD.ProductID Where SalesOrderID = 43664 FOR XML PATH('')),1,1,'')
O seguinte resultado foi apresentado:
Precisamos colocar o CHAR(10) para que o gerador de relatório interpresse esse código como <Enter>, colocando assim cada uma das linhas em uma linha separada no relatório (diferente do retorno de várias linhas do SQL).
Dessa forma, fizemos que esse campo retornasse um MEMO para o gerador de relatório.