Blog
home > blog > TSQL: concatenare più record senza usare un cursore

Tag: sql, SQL Server, Programmazione, TSQL, Microsoft

TSQL: concatenare più record senza usare un cursore

Concatenare più record di una tabella in un'unica stringa necessita un cursore, che però è poco performante. Vediamo un metodo tramite FOR XML PATH per concatenare con una query secca.
di Maurizio Ceravolo
Nell'uso dei database alcune volte c'è la necessità di concatenare uno o più campi di più record.

Se pensiamo ad un esempio pratico, possiamo pensare ad una situazione classica. Una applicazione multiutente, che sia web o windows, in cui abbiamo degli utenti ed ogni utente può avere uno o più profili. Supponiamo di dover realizzare un elenco in cui in ogni riga ci sia il nome dell'utente, e su un'altra colonna i profili a lui assegnati separati da virgola.

Generalmente, su SQL Server, per ottenere questo tipo di risultato con il Transact SQL, siamo costretti ad usare un cursore, anzi nel caso specifico occorre un doppio cursore, uno per iterare fra gli utenti ed un altro per ciclare fra i profili di uno stesso utente. Il problema di questo tipo di soluzione è che i cursori sono inefficenti e quindi, su grandi quantità di dati o su frequenti richieste, potrebbe portare ad un deficit prestazionale. 

Quando possibile è sempre meglio evitare di usare questa tecnica.

Nel nostro caso specifico vediamo come realizzare la concatenazione utilizzando una query secca. Possiamo utilizzare due tecniche, o tramite le CTE oppure tramite l'uso di FOR XML PATH. In questo post utilizzeremo la seconda tecnica, più semplice, lasciando l'analisi delle CTE, strumento molto potente, ad un futuro post.

Per concatenare un campo su più record, la scrittura è molto semplice usando FOR XML PATH:

SELECT ', ' + NomeCampo FROM Tabella FOR XML PATH ('')

Con questa scrittura il risultato della query è del tipo

,valore 1, valore 2, valore 3, .....

L'unica cosa antipatica è che in questo modo ci troviamo una virgola all'inizio della stringa. Per completare il lavoro ci viene in aiuto la funzione STUFF:

SELECT STUFF ((SELECT ', ' + NomeCampo FROM Tabella FOR XML PATH ('')),1,2,'') AS Concatenazione
con questa funzione il risultato diventa quello richiesto, ovvero:

valore 1, valore 2, valore 3, .....

Per chi vuole approfondire l'uso di STUFF e FOR XML PATH può seguire i link della documentazione Microsoft
Post correlati
2011
18
Marzo
TSQL: convertire un numero in esadecimale
Maurizio Ceravolo
Alle volte c'è la necessità di convertire un numero in esadecimale direttamente dalla fonte dati per generare dei codici colore da usare direttamente su una pagina web.
2012
26
Ottobre
Ebook gratuito: Programming Windows 8 Apps with HTML, CSS, and JavaScript
Maurizio Ceravolo
Iniziano le vendite di Windows 8, un sistema operativo che rappresenta una nuova sfida per gli sviluppatori. E quindi cosa di meglio di ebook per imparare le nuove tecniche?
2011
5
Luglio
Formattare e indentare le query SQL
Maurizio Ceravolo
Programmando con editor avanzati si può sfruttare l'indentazione automatica del codice. Cosa che manca nelle interfacce per i database. Vediamo come aggirare il problema.
2010
28
Ottobre
Ripristinare un backup su una versione precedente di SQL Server
Maurizio Ceravolo
Microsoft impedisce di ripristinare un backup creato con una versione successiva di SQL Server. Esaminiamo un workaround per aggirare il problema.
2011
3
Novembre
Microsoft Codename "Social Analytics"
Maurizio Ceravolo
I laboratori di SQL Azure, rilasciano un servizio cloud sperimentale per analizzare gli andamenti social su social network, blog e forum. Con le API per gli sviluppatori.


Archivio Mensile Blog
Tag Cloud
+1 A grande richiesta Apple Azure Facebook geek Geolocalizzazione Google Google+ humor infografica innovazione iPad Lego Microsoft RDP social network video videogiochi viral
Ultimi Post
I migliori di oggi
I più popolari del mese
Top post