Se stai usando SQL Server 2005, puoi usare il comando FOR XML PATH.
SELECT [VehicleID]
, [Name]
, (STUFF((SELECT CAST(', ' + [City] AS VARCHAR(MAX))
FROM [Location]
WHERE (VehicleID = Vehicle.VehicleID)
FOR XML PATH ('')), 1, 2, '')) AS Locations
FROM [Vehicle]
È molto più semplice che usare un cursore e sembra funzionare abbastanza bene.
Aggiorna
Per chiunque utilizzi ancora questo metodo con le versioni più recenti di SQL Server, c'è un altro modo per farlo che è un po' più semplice e performante usando il STRING_AGG
metodo disponibile da SQL Server 2017.
SELECT [VehicleID]
,[Name]
,(SELECT STRING_AGG([City], ', ')
FROM [Location]
WHERE VehicleID = V.VehicleID) AS Locations
FROM [Vehicle] V
Ciò consente anche di specificare un separatore diverso come secondo parametro, fornendo un po' più di flessibilità rispetto al metodo precedente.