Как называется поведение в приведенном ниже утверждении?
Create table dbo.Foo(name varchar(10)) insert dbo.Foo (name) select 'Weird' union select 'SQL' union select 'Server' union select 'behavior' declare @title varchar(max) set @title = '' select @title = name + ' ' + @title from dbo.Foo select @title --returns 'Weird SQL Server behavior'
Это также можно сделать с целыми числами. Я хочу знать имя для этого поведения, которое смешивает скалярные и множественные операции.
Что именно странного в этом? Вы выбираете 4 строки, SQL Server запускается:
@title = name + ' ' + @title
Четыре раза, и в итоге вы получаете строку, которую вы упомянули.
Вроде тоже повезло, так как порядок действительно случайный.
Конкатенация строк?
Это один из методов, используемых иногда для объединения строк в SQL, см. Объединение значений строк в Transact-SQL . Не рекомендуется, поскольку зависит от порядка исполнения. В реальной таблице вы можете получить «странное поведение SQL», а также «поведение странного сервера SQL». Проблема задокументирована в PRB: план выполнения и результаты агрегированных конкатенационных запросов зависят от местоположения выражения .
Я бы назвал это побочным эффектом от вычисления выражения для каждой строки запроса.
Никто не упоминал, что SELECT @title = name FROM dbo.Foo - это простой способ выбрать значение из таблицы и поместить его в переменную внутри SQL BATCH.
SELECT @title = name FROM dbo.Foo
Итак, select @title = name + ' ' + @title from dbo.Foo выбирает значение каждой строки в dbo.Foo и добавляет его в конце @title.
select @title = name + ' ' + @title from dbo.Foo
@title