То, что вы опубликовали в методе агрегирования строк, использовавшемся в более старых версиях SQL Server.Для этого в SQL Server 2017 предусмотрен STRING_AGG.
Этот метод создает значение XML из запроса, используя пустую строку в качестве имени элемента..value('(./text())[1]','NVARCHAR(MAX)')
в конце преобразует значение XML в текст.Наконец, STUFF, 1,2,'')
удаляет ведущий разделитель.
Поскольку вы хотите объединить строки и не хотите оставлять форматирование даты случайным, используйте FORMAT () для форматирования даты в нужную строку:
Email = STUFF((SELECT ', ' + FORMAT([DateValue],'yyyy-MM-dd')
FROM EmailTable
WHERE ID = r.ID AND EmailType = 1
FOR XML PATH(''),TYPE
).value('(./text())[1]','NVARCHAR(MAX)'),
1,2,'')
Как это работает
Выполнение самого внутреннего запроса с x
в качестве имени элемента:
SELECT ', ' + format(DateValue,'yyyy-MM-dd')
FROM EmailTable
WHERE year=2019 and Day<5 and month=1
FOR XML PATH('x'),TYPE
Возвращает:
<x>, 2019-01-01</x>
<x>, 2019-01-02</x>
<x>, 2019-01-03</x>
<x>, 2019-01-04</x>
Указав пустую строку в качестве элемента, мы получим:
, 2019-01-01, 2019-01-02, 2019-01-03, 2019-01-04
Это все еще значение XML, внутренний текст которого представляет собой желаемую строку.Нам нужно извлечь это с помощью .value('(./text())[1]','nvarchar(max)')
:
select ( SELECT ', ' + format(DateValue,'yyyy-MM-dd')
FROM EmailTable
WHERE year=2019 and Day<5 and month=1
FOR XML PATH(''),TYPE
).value('(./text())[1]','nvarchar(max)')
После этого нам нужно удалить ведущий разделитель, в этом случае двухсимвольный . T-SQL doesn't have a
REMOVE string function and
SUBSTRING needs a length.
STUFF` удаляет указанное количество символов перед добавлением новой строки, поэтому его можно использовать для удаления текста с самого начала.