Странное поведение SQL Server - PullRequest
0 голосов
/ 26 ноября 2009

Как называется поведение в приведенном ниже утверждении?

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'

Это также можно сделать с целыми числами. Я хочу знать имя для этого поведения, которое смешивает скалярные и множественные операции.

Ответы [ 5 ]

2 голосов
/ 27 ноября 2009

Что именно странного в этом? Вы выбираете 4 строки, SQL Server запускается:

 @title = name + ' ' + @title

Четыре раза, и в итоге вы получаете строку, которую вы упомянули.

Вроде тоже повезло, так как порядок действительно случайный.

2 голосов
/ 27 ноября 2009

Конкатенация строк?

1 голос
/ 27 ноября 2009

Это один из методов, используемых иногда для объединения строк в SQL, см. Объединение значений строк в Transact-SQL . Не рекомендуется, поскольку зависит от порядка исполнения. В реальной таблице вы можете получить «странное поведение SQL», а также «поведение странного сервера SQL». Проблема задокументирована в PRB: план выполнения и результаты агрегированных конкатенационных запросов зависят от местоположения выражения .

1 голос
/ 27 ноября 2009

Как называется поведение в приведенном ниже утверждении?

Я бы назвал это побочным эффектом от вычисления выражения для каждой строки запроса.

0 голосов
/ 27 ноября 2009

Никто не упоминал, что SELECT @title = name FROM dbo.Foo - это простой способ выбрать значение из таблицы и поместить его в переменную внутри SQL BATCH.

Итак, select @title = name + ' ' + @title from dbo.Foo выбирает значение каждой строки в dbo.Foo и добавляет его в конце @title.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...