Ускорение запроса путем удаления курсора - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть запрос, который выглядит так

 declare @tmpTable Table(id int)
 insert into @tmpTable(id) values (3)
 insert into @tmpTable(id) values (5)
 insert into @tmpTable(id) values (11)

 declare @tmp int
 declare @finalString varchar(MAX)

 DECLARE c1 CURSOR READ_ONLY FOR SELECT ID FROM @tmpTable
 OPEN c1
 FETCH NEXT FROM c1 INTO @tmp
 set @finalString=cast(@tmp as varchar)
 FETCH NEXT FROM c1 INTO @tmp
 WHILE @@FETCH_STATUS = 0
 begin
  set @finalString=@finalString+','+cast(@tmp as varchar)
  FETCH NEXT FROM c1 INTO @tmp
 end    
 close c1
 deallocate c1  

 select @finalString

Я хочу создать форматированную строку «3,5,11» из значений столбцов таблицы, этот код работает, но есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Вы можете использовать CTE или xquery.

CTE:
with t1(rowNum, id) as
(
    select rowNum, id from Temp1
),
t2(rowNum, str) as
(
    select 1, cast(id as varchar(250)) from t1 where rowNum=1
    union all
    select t1.rowNum, str || ',' || cast(t1.id as varchar(3)) from t1,t2
    where t2.rowNum+1 = t1.rowNum
)
select str from t2 order by rownum desc FETCH FIRST 1 ROWS ONLY;
0 голосов
/ 08 апреля 2011

Конечно - используйте этот метод (STUFF в сочетании с FOR XML PATH):

SELECT
   STUFF((SELECT ','+CAST(id AS VARCHAR(10))
          FROM @tmpTable    
          FOR XML PATH('')), 1, 1, '')

Возвращает вывод:

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