Si usa SQL Server 2005, puede usar el 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]
Es mucho más fácil que usar un cursor y parece funcionar bastante bien.
Actualizar
Para cualquiera que todavía use este método con versiones más nuevas de SQL Server, hay otra forma de hacerlo que es un poco más fácil y más eficaz usando el STRING_AGG
método que ha estado disponible desde SQL Server 2017.
SELECT [VehicleID]
,[Name]
,(SELECT STRING_AGG([City], ', ')
FROM [Location]
WHERE VehicleID = V.VehicleID) AS Locations
FROM [Vehicle] V
Esto también permite especificar un separador diferente como segundo parámetro, proporcionando un poco más de flexibilidad con respecto al método anterior.