2016-03-28 4 views
1

Мой код:агрегации SQL Строка возвращает разные результаты в зависимости от местоположения переменных

if object_id('tempdb..#t1') is not null drop table #t1 

create table #t1 (ID int, name varchar(10)) 

insert into #t1 values (1,'2'), (6,'2'), (6,'2'), (1,'4') 

DECLARE @CHARS VARCHAR(100) = '' 
SELECT @CHARS = @CHARS + name + ', ' -- <---CODE OF INTEREST 
FROM #t1 

Это возвращает 2, 2, 2, 4,. Все хорошо.

Однако, когда я изменить код выше, чтобы добавить запятую и место первого:

DECLARE @CHARS VARCHAR(100) = '' 
SELECT @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST 
FROM #t1 

SELECT @CHARS 

возвращает , , , , 2224. Должна ли она возвращаться , 2, 2, 2, 4?

ответ

1

Логика второй формуле: для каждой записи она добавляет строку в правой части @CHARS

предположим, что вы

insert into #t1 values (1,'2'), (6,'3'), (6,'4'), (1,'5') 

, чтобы сделать его более ясным

Для первая строка возвращается ", 2"

для второго ряда, вы @CHARS будут ", " + ", 2" + "3"

для третьего ряда, @CHARS является ", , 23" так будет установлен @CHARS к ", " + ", , 23" + "4"

попытка ниже запросов, чтобы увидеть, что происходит:

DECLARE @CHARS VARCHAR(100) = '' 
SELECT top 1 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST 
FROM #t1 

print @CHARS 
go 

Result: , 2 
-------------------------- 
DECLARE @CHARS VARCHAR(100) = '' 
SELECT top 2 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST 
FROM #t1 

print @CHARS 
go 

Result: , , 23 
---------------------- 
DECLARE @CHARS VARCHAR(100) = '' 
SELECT top 3 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST 
FROM #t1 

print @CHARS 
go 
Result: , , , 234 
+0

Вы абсолютно правы! Это делает кучу смысла! Не могу поверить, что я не сделал этого сам.>:/Спасибо! –