Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Заменить курсоры или ускорить  [new]
Qwe.Qwe1
Member

Откуда:
Сообщений: 264
Подскажите, чем можно заменить курсоры для такой задачи: для каждой записи таблицы мне нужно получить информацию из другой таблицы в виде строки "№ 1 от 10.10.2010, № 10 от 15.02.2013, № 20 от 01.12.2014". Для этого была создана функция, которая по ID в другой таблице выбирала n записей с номером и датой заказа и курсором проходила по ней для формирования результируюущей строки. В результате все это дело очень долго выполняется (несмотря на CURSOR LOCAL FAST_FORWARD):
Select ID, Name, dbo.MyFunc(ID) 'OrderInfo' From Orders


BEGIN
       DECLARE @ResultVar varchar(500)
       SET @ResultVar = '' 

       DECLARE cursor_get CURSOR LOCAL FAST_FORWARD FOR
             Select ISNULL(ORD_NUM, ''), ISNULL(CONVERT(VARCHAR(10), ORD_DATE, 104), '') From DETAILS Where ORD_ID = @id Order By 2 Desc
       OPEN cursor_get    

       DECLARE @ord_num AS VARCHAR(50)
       DECLARE @ord_date AS VARCHAR(10)
           
       FETCH NEXT FROM cursor_get INTO @ord_num, @ord_date
       WHILE @@FETCH_STATUS = 0
       BEGIN
             SET @ResultVar = @ResultVar + @ord_num + ' от ' + @ord_date + ', '         

             FETCH NEXT FROM cursor_getdoc INTO @ord_num, @ord_date
       END
       CLOSE cursor_get
       --DEALLOCATE cursor_get                  

       RETURN CASE WHEN LEN(@ResultVar) = 0 THEN '' ELSE LEFT(@ResultVar, LEN(@ResultVar) - 1) END
END
7 июл 15, 13:08    [17862028]     Ответить | Цитировать Сообщить модератору
 Re: Заменить курсоры или ускорить  [new]
_djХомяГ
Guest
В поиске посмотрите for xml path('') да и в FAQ есть решения
7 июл 15, 13:11    [17862051]     Ответить | Цитировать Сообщить модератору
 Re: Заменить курсоры или ускорить  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @ResultVar VARCHAR(500)
SET @ResultVar = '' 

SELECT @ResultVar = @ResultVar + ISNULL(ORD_NUM, '') + ' от ' + ISNULL(CONVERT(VARCHAR(10), ORD_DATE, 104), '') + ', '
FROM DETAILS
WHERE ORD_ID = @id
ORDER BY ORD_DATE DESC


а лучше почитайте о конкатенации строк.
10 июл 15, 15:30    [17877382]     Ответить | Цитировать Сообщить модератору
 Re: Заменить курсоры или ускорить  [new]
_djХомяГ
Guest
AlanDenton
DECLARE @ResultVar VARCHAR(500)
SET @ResultVar = '' 

SELECT @ResultVar = @ResultVar + ISNULL(ORD_NUM, '') + ' от ' + ISNULL(CONVERT(VARCHAR(10), ORD_DATE, 104), '') + ', '
FROM DETAILS
WHERE ORD_ID = @id
ORDER BY ORD_DATE DESC



Ню ню
Посмотрим насколько быстро заработает эта конструкция при большом кол ве строк
10 июл 15, 15:44    [17877482]     Ответить | Цитировать Сообщить модератору
 Re: Заменить курсоры или ускорить  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
автор
Ню ню
Посмотрим насколько быстро заработает эта конструкция при большом кол ве строк

Вот зачем злословить,вместо того чтоб написать как правильно?


 
SELECT    ISNULL(ORD_NUM, '') + ' от ' + ISNULL(CONVERT(VARCHAR(10), ORD_DATE, 104), '') + ', '
FROM DETAILS
WHERE ORD_ID = @id
FOR XML PATH ('')
10 июл 15, 16:37    [17877851]     Ответить | Цитировать Сообщить модератору
 Re: Заменить курсоры или ускорить  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
AlanDenton
SELECT @ResultVar = @ResultVar + ISNULL(ORD_NUM, '') + ' от ' + ISNULL(CONVERT(VARCHAR(10), ORD_DATE, 104), '') + ', '
так агрегировать и конкатенировать нельзя
10 июл 15, 18:03    [17878431]     Ответить | Цитировать Сообщить модератору
 Re: Заменить курсоры или ускорить  [new]
o-o
Guest
Гадя Петрович
AlanDenton
SELECT @ResultVar = @ResultVar + ISNULL(ORD_NUM, '') + ' от ' + ISNULL(CONVERT(VARCHAR(10), ORD_DATE, 104), '') + ', '
так агрегировать и конкатенировать нельзя

не, ну для начала AlanDenton схитрил и из сортировки выкинул ISNULL(CONVERT(VARCHAR(10), ORD_DATE, 104), '')
(у ТС ведь имено по этому выражению сортировка),
а то бы да, лихо б обломался (картинка прилагается)

а во-вторых, есть же спец. тема по мотивам как раз той вашей,
с исчерпывающим объяснением и еще бОльшей кучей картинок :)
SORT iterator или еще раз о "сборе в переменную"

К сообщению приложен файл. Размер - 25Kb
10 июл 15, 23:30    [17879373]     Ответить | Цитировать Сообщить модератору
 Re: Заменить курсоры или ускорить  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
o-o
а во-вторых, есть же спец. тема по мотивам как раз той вашей,
с исчерпывающим объяснением и еще бОльшей кучей картинок :)
SORT iterator или еще раз о "сборе в переменную"

Картинка с другого сайта.
ага, лень было искать просто :)
12 июл 15, 10:38    [17881949]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить