FOR SQL SERVER 2008 - 2016
Этот обходной путь использует XML PATH и STUFF для объединения нескольких строк одной переменной в один ряд объединенных значений.Это решение имитирует STRING_AGG из SQL SERVER 2017.
Я продемонстрирую использование базы данных AdventureWorks и следующий запрос:
SELECT SOH.SalesOrderID
,STUFF
(
(
SELECT ', ' + CAST(SOD.ProductID AS VARCHAR(20)) AS [text()]
FROM AdventureWorks2016.Sales.SalesOrderDetail AS SOD
WHERE SOH.SalesOrderID = SOD.SalesOrderID
ORDER BY SOD.SalesOrderDetailID
FOR XML PATH('')
), 1, 1, NULL
) AS ProductIDs
FROM AdventureWorks2016.Sales.SalesOrderHeader AS SOH
Пример вывода:
SalesOrderID ProductIDs
51176 796, 872
51177 970, 708
51178 779, 871, 870
51179 795, 933, 922, 879
51180 793, 872, 870, 707, 714
51181 792, 922, 933, 707
ПУТЬ XMLобъединяет вместе, возвращая значения в виде текстовых узлов.STUFF исключает запятую.Оператор SELECT объединит собранные текстовые узлы и разделит результаты, используя следующую строку:
SELECT ', ' + CAST(SOD.ProductID AS VARCHAR(20)) AS [text()]
PITFALL: Обязательно приведите ваш SHARE_NBR как VARCHAR (или NVARCHAR), поскольку он не будет работать счисловые типы данных, поскольку XML PATH возвращает данные текстового типа.