Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak utworzyć funkcję SQL Server, aby połączyć wiele wierszy z podzapytania w jedno pole rozdzielane?

Jeśli używasz SQL Server 2005, możesz użyć polecenia 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]

Jest to o wiele łatwiejsze niż używanie kursora i wydaje się, że działa całkiem nieźle.

Aktualizacja

Dla każdego, kto nadal używa tej metody z nowszymi wersjami SQL Server, istnieje inny sposób na zrobienie tego, który jest nieco łatwiejszy i bardziej wydajny przy użyciu STRING_AGG metoda dostępna od SQL Server 2017.

SELECT  [VehicleID]
       ,[Name]
       ,(SELECT STRING_AGG([City], ', ')
         FROM [Location]
         WHERE VehicleID = V.VehicleID) AS Locations
FROM   [Vehicle] V

Pozwala to również na określenie innego separatora jako drugiego parametru, zapewniając nieco większą elastyczność w porównaniu z poprzednią metodą.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:Wyodrębnij metadane tabeli (opis, pola i ich typy danych)

  2. SQL Server, wprowadzający w błąd XLOCK i optymalizacje

  3. Jak utworzyć ograniczenie sprawdzania w wielu kolumnach w SQL Server — samouczek SQL Server/TSQL — część 84

  4. Jak usunąć spacje nierozdzielające z kolumny na serwerze SQL?

  5. Jak łatwo i szybko sparametryzować ciąg o wartości null za pomocą DBNull.Value?