Se você estiver usando o SQL Server 2005, poderá usar o 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]
É muito mais fácil do que usar um cursor e parece funcionar muito bem.
Atualizar
Para quem ainda usa esse método com versões mais recentes do SQL Server, há outra maneira de fazer isso que é um pouco mais fácil e com melhor desempenho usando o
STRING_AGG
método que está disponível desde o SQL Server 2017. SELECT [VehicleID]
,[Name]
,(SELECT STRING_AGG([City], ', ')
FROM [Location]
WHERE VehicleID = V.VehicleID) AS Locations
FROM [Vehicle] V
Isso também permite que um separador diferente seja especificado como segundo parâmetro, proporcionando um pouco mais de flexibilidade em relação ao método anterior.