Cela pourrait être l'approche plus propre que vous recherchez. Fondamentalement, vérifiez si la variable a encore été initialisée. Si ce n'est pas le cas, définissez-le sur la chaîne vide et ajoutez la première ville (pas de virgule principale). Si c'est le cas, ajoutez une virgule, puis ajoutez la ville.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Bien sûr, cela ne fonctionne que pour remplir une variable par état. Si vous tirez la liste pour chaque état un par un, il existe une meilleure solution en une seule fois:
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];
Résultats:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
Pour commander par nom de ville dans chaque état:
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];
Dans Azure SQL Database ou SQL Server 2017+, vous pouvez utiliser la nouvelle STRING_AGG()
fonction :
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Et classés par nom de ville:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];