Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да създадете функция на SQL Server, за да обедините множество редове от подзаявка в едно ограничено поле?

Ако използвате SQL Server 2005, можете да използвате командата 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]

Това е много по-лесно от използването на курсор и изглежда работи доста добре.

Актуализиране

За всеки, който все още използва този метод с по-нови версии на SQL Server, има друг начин да го направи, който е малко по-лесен и по-ефективен с помощта на STRING_AGG метод, който е наличен от SQL Server 2017.

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

Това също така позволява да се посочи различен разделител като втори параметър, осигурявайки малко повече гъвкавост спрямо предишния метод.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Стойност на производителността на водачите COMB

  2. Как да стартирам съхранена процедура в sql сървър на всеки час?

  3. Как програмно определяте кои SQL таблици имат колона за идентичност

  4. freeTDS не използва своята конфигурация

  5. Как да върнете списък с типове данни в SQL Server (T-SQL)