Я наблюдал некоторое странное поведение в MS SQL Server 2017.
+=
в select действует как агрегатор ("объединить значения из всех строк"), когда справа находится константа.+=
в select действует как "просто установите значение", когда справа находится имя столбца. (также это влияет на поведение агрегирования для других столбцов)
Итак, мои вопросы:
- Почему результат
@c1
содержит значение только последней строки, даже если используется+=
? - Почему
@c2
затронуто изменением+=
->=
для@c1
?
Версия 1:
BEGIN
DECLARE
@c1 NVARCHAR(MAX) = N'',
@c2 NVARCHAR(MAX) = N'';
SELECT
@c1 = constraint_name, -- version-1
@c2 += '+'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
ORDER BY 1 DESC
;
PRINT '@c1=' + @c1;
PRINT '@c2=' + @c2;
END
;
Результат версии 1:
@c1 = fk_abcde
@c2 = ++++++++++++++++++++++++++++++++++++++++++
(`@c2` result is aggregation of many rows; one plus for each row)
Версия 2:
BEGIN
DECLARE
@c1 NVARCHAR(MAX) = N'',
@c2 NVARCHAR(MAX) = N'';
SELECT
@c1 += constraint_name, -- version-2
@c2 += '+'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
ORDER BY 1 DESC
;
PRINT '@c1=' + @c1;
PRINT '@c2=' + @c2;
END
;
Версия 2 Результат:
@c1 = fk_abcde
@c2 = +
(`@c2` is just value assigned from last processed row)
Это кажется очень странным - вроде как ошибка. Я не могу найти какие-либо документы об этом. doc on '+= string' вообще не упоминайте +=
использование в select
запросе.
(на данный момент моя цель - полностью понять поведение, чтобы я случайно не наступил на него. Любые подсказки к правильной документации/ключевым словам для поиска были бы полезны)
STRING_AGG
в SQL Server 2017. Существуют и другие способы сделать то же самое в предыдущих версиях, все они описаны в Статьи Аарона Бертрана. Самый быстрый и масштабируемый способ — использовать SQLCLR UDF илиFOR XML
. - person Panagiotis Kanavos   schedule 27.02.2019STRING_AGG
. Спасибо. - person IndustryUser1942   schedule 28.02.2019