Циклическое исполнение SELECT. Недокументированная фича?

Читаем доку (BOL):

SELECT @local_variable is typically used to return a single value into the variable. However, when expression is the name of a column, it can return multiple values. If the SELECT statement returns more than one value, the variable is assigned the last value that is returned.

По наводке Николая Лобастова делаю простой пример:

declare @tab table (id int identity(1,1), s varchar(32))
 
insert into @tab (s) values ('первая')
insert into @tab (s) values ('вторая')
insert into @tab (s) values ('третья')
insert into @tab (s) values ('четвертая')
 
declare @var varchar(255)
 
set @var=''
select @var=@var + ', ' + s from @tab order by id
select @var
go

Получаю:
, первая, вторая, третья, четвертая

Я один думал, что должно быть @var=', четыре'?
Что скажет гуру по MS SQL?

Forums: 

Все правильно. Там остается ПО

Все правильно. Там остается ПОСЛЕДНЕЕ. Потому что присваивается много раз, потому и остается ПОСЛЕДНЕЕ. Про то, что присваивается ОДИН раз никто не обещал

Кроме того, переполнение строки в подобных операторах молча игнорируется

Еще классный оператор типа

update TAB set @var=COL=EXPR
Если EXPR содержит @var, то вообще эффекты самые изумительные :)

Это надо было больше 10 лет пр

Это надо было больше 10 лет прожить с убеждением что сначало выполняется select, а потом присваивание :-(.
Пойду убьюсь апстену

Изображение пользователя ipanshin.

set @var='' sele

set @var=''
select @var=@var + ', ' + s from @tab order by id
select @var
go

Это здорово использовать для динамического sql , когда далее делаешь
exec(@var)

update TAB set @var=COL=EXPR

А это для меня внове.

Пойду убьюсь апстену

Да не бери в голову. Я вот убиваюсь по поводу запрета модификации системных таблиц. микрософт просто кидает всех на неэффективный код выполнения операций через курсор с использованием его апи.

Изображение пользователя ipanshin.

Да интересный эффект. В переме

Да интересный эффект. В переменной получаешь последнее значение. А на значения в таблице рекурсивно накладывается шаблон применяемой функции.

--update TAB set @var=COL=EXPR

create table #tbl(num int identity, s varchar(4000) null)
insert into #tbl(s) select 'aaa'
insert into #tbl(s) select 'bbb'
insert into #tbl(s) select 'ccc'
delete from #tbl

declare @var varchar(4000)
set @var=''
update #tbl set @var=s=@var+substring(s,1,1)
select @var
select * from #tbl
@var = abc
13 a
14 ab
15 abc

Изображение пользователя ipanshin.

Вот интересная зарисовка в про

Вот интересная зарисовка в противовес использования с шарпа как инструмента макроподстановок при гнерации текста.
Гораздо легче и мощнее, чем такого плана генерация как

на с шарп
builder.AppendFormat(" DELETE [dbo].[dvtable_{0}{1}] WITH(ROWLOCK)",
section.GUID.ToString("B").ToUpper(), archive ? string.Empty : "_archive");
builder.AppendLine();
builder.AppendLine(" WHERE [InstanceID] IN ( SELECT InstanceID FROM #dvsp_crd_arch ) ");

на sql
create table #tbl(num int identity, s varchar(4000) null)
insert into #tbl(s) select ' при'
insert into #tbl(s) select 'е{1}а'
insert into #tbl(s) select 'ли '
delete from #tbl

declare @var varchar(4000)
set @var=''
update #tbl set @var=s=@var+replace(s,'{1}','х')
select @var
select * from #tbl
@var = приехали
22 при
23 приеха
24 приехали

update #tbl set @var=s=@var+replace(s,'{1}','зж')
@var = приезжали
25 при
26 приезжа
27 приезжали