Essa pode ser a abordagem mais limpa que você procura. Basicamente, verifique se a variável já foi inicializada. Caso contrário, defina-o como a sequência vazia e acrescente a primeira cidade (sem vírgula à esquerda). Se houver, adicione uma vírgula e depois a cidade.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Obviamente, isso só funciona para preencher uma variável por estado. Se você está puxando a lista de cada estado, um de cada vez, há uma solução melhor de uma só vez:
SELECT [state], cities = STUFF((
SELECT N', ' + city FROM dbo.tbl
WHERE [state] = x.[state]
FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];
Resultados:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
Para solicitar pelo nome da cidade em cada estado:
SELECT [state], cities = STUFF((
SELECT N', ' + city FROM dbo.tbl
WHERE [state] = x.[state]
ORDER BY city
FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];
No Banco de Dados SQL do Azure ou no SQL Server 2017 ou superior, você pode usar a nova STRING_AGG()
função :
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
E ordenado pelo nome da cidade:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Apenas para adicionar à resposta de Aaron acima ...
Esteja ciente de que um
ORDER BY
pode ser interrompido incluindo apenas o último item na sua consulta. No meu caso, eu não estava agrupando, então não tenho certeza se isso faz alguma diferença. Estou usando o SQL 2014. No meu caso, tenho algo como valor1, valor2, valor3 ... mas meu resultado na variável foi apenas valor3.Aaron comentou ao dizer:
Isso foi relatado pelo menos quatro vezes no Connect:
Exemplo de resposta da Microsoft:
A resposta também faz referência a KB 287515:
PRB: Plano de execução e resultados de consultas agregadas de concatenação dependem do local da expressão
A solução é usar
FOR XML PATH
(a segunda abordagem na resposta de Aaron) se a ordem da concatenação é importante e, é claro, se você quiser ter certeza de incluir todos os valores. Veja também:comportamento inexplicável da concatenação nvarchar / index / nvarchar (max) no estouro de pilha
fonte