MS SQL: Concatenare i risultati di una subquery



Puo' capitare, costruendo una query, di dover realizzare una subquery che restituisca piu' di un risultato.
Un esempio pratico:

[sourcecode language="sql"]

select Nome, Cognome, ( select Numero_di_telefono from Numeri_di_telefono where Numeri_di_telefono.id_utente = Utenti.id_utente)
from Utenti

[/sourcecode]

La query e' ovviamente sbagliata e, invece di restituire su una unica riga il Nome e Cognome dell'utente seguiti dai suoi numeri di telefono risponde con un bel
Subquery returned more than 1 value.

Per risolvere il problema si puo' operare in 2 diversi modi, a seconda se la versione di SQLServer usata sia la 2000 o la 2005.

Quindi, con SQLServer 2005 useremo le funzioni di esportazione dei dati in XML, native della piattaforma:

[sourcecode language="sql"]

select Nome, Cognome,( select Numero_di_telefono + ' ' as [text()] from Numeri_di_telefono where Numeri_di_telefono.id_utente = Utenti.id_utente for xml path('')) from Utenti

[/sourcecode]

Mentre con SQLServer 2000 dovremo realizzare una breve funzione per integrare le funzionalita' mancanti.

Dal QueryAnalyzer creiamo la funzione:

[sourcecode language="sql"]

create function dbo.Concatena(@id_utente)
returns varchar(8000)
as
Begin
Declare @result as varchar(8000)
Set @result =''
Select @result = @result + Numero_di_telefono + ' ' from Numeri_di_telefono
where Numeri_di_telefono.id_utente = @id_utente
return @result
End

[/sourcecode]

a questo punto, possiamo richiamare la funzione creata all'interno della nostra query:

[sourcecode language="sql"]

select Nome, Cognome, dbo.Concatena(utenti.id_utente) from Utenti

[/sourcecode]

Published: May 30 2008

  • category: