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
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]
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]