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

Откуда:
Сообщений: 132
Доброго дня всем.
Есть запрос, который возвращает таблицу с колонкой, содержащей строки вида:
cmd
exec dbo.gen_addfiletoqueue 'US_0013N_1.xml'
exec dbo.gen_addfiletoqueue 'US_00140_1.xml'
exec dbo.gen_addfiletoqueue 'US_01550_1.xml'
exec dbo.gen_addfiletoqueue 'US_04860_1.xml'
exec dbo.gen_addfiletoqueue 'US_A0233_1.xml'


т. е. строку запуска некой ХП.
после получения этих строк их нужно выполнить.
Как это лучше реализовать? Можно ли всей пачкой запустить?
Вариант с execute в цикле по курсору не очень нравится, потому и возник этот вопрос. Может есть варианты по-лучше?
6 авг 14, 13:16    [16406174]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
_djХомяГ
Guest
скопируйте из окна с результатом да выполните
6 авг 14, 13:20    [16406213]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Вариант с execute в цикле по курсору не очень нравится, потому и возник этот вопрос.

Все равно все команды в одном соединении будут выполняться последовательно. Как их не запускай.
6 авг 14, 13:21    [16406223]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
_djХомяГ
скопируйте из окна с результатом да выполните

когда нужно было пару раз это сделать - так и поступал, но сейчас нужно это поставить на поток и запихнуть в другую ХП

Glory
Все равно все команды в одном соединении будут выполняться последовательно. Как их не запускай.

Это я понимаю. Просто насколько я знаю, как читал не только на этом форуме, курсор не есть гуд, ибо ресурсозатратный.
Т. о. только вариант с курсором?
6 авг 14, 13:25    [16406253]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37143
BuKTaP
Т. о. только вариант с курсором?
Переписать процедуру dbo.gen_addfiletoqueue, чтобы она принимала не 1 параметр, а таблицу.
6 авг 14, 13:27    [16406261]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Glory
BuKTaP
Вариант с execute в цикле по курсору не очень нравится, потому и возник этот вопрос.

Все равно все команды в одном соединении будут выполняться последовательно. Как их не запускай.
C клиента-то можно и асинхронно запускать.
А так - в цикле по курсору выполнять EXEC(@cmd);
6 авг 14, 13:29    [16406275]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Это я понимаю. Просто насколько я знаю, как читал не только на этом форуме, курсор не есть гуд, ибо ресурсозатратный.

Мда. Слышал звон, но не знаю, где он
Вы считаете, что в вашей задаче именно перебор записей будет самой медленной операцией ?
А каждый вызов процедуры dbo.gen_addfiletoqueue ничего не будет стоить ?
6 авг 14, 13:29    [16406281]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Гавриленко Сергей Алексеевич
BuKTaP
Т. о. только вариант с курсором?
Переписать процедуру dbo.gen_addfiletoqueue, чтобы она принимала не 1 параметр, а таблицу.


Можно было бы и так, но gen_addfiletoqueue переписывать запрещают :( Не всё в моих руках.

Итак: не имея никаких других условий, кроме предоставленных в первом посте, можно ли обойтись без курсора?

P.S.: Я так понимаю, что нет. Если бы было можно - уже подсказали бы.
6 авг 14, 13:31    [16406291]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Гавриленко Сергей Алексеевич
BuKTaP
Т. о. только вариант с курсором?
Переписать процедуру dbo.gen_addfiletoqueue, чтобы она принимала не 1 параметр, а таблицу.
Подозреваю, это всё в одной инструкции делается, без всяких процедур.
Хотя, если там разные процедуры в cmd прописаны, то курсор FAST_FORWARD - лучшее решение
6 авг 14, 13:33    [16406301]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
Glory
Member

Откуда:
Сообщений: 104760
BuKTaP
Итак: не имея никаких других условий, кроме предоставленных в первом посте, можно ли обойтись без курсора?

Можете. Только заметно быстрее от этого не станет
6 авг 14, 13:35    [16406313]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
BuKTaP
Итак: не имея никаких других условий, кроме предоставленных в первом посте, можно ли обойтись без курсора?

P.S.: Я так понимаю, что нет
Соверешнно верно.

От курсоров советуют избавляться, переделывая отдельные операции на операции над множествами.

Если же нужно выполнять отдельные операции, и переделать их нельзя (переписать процедуру dbo.gen_addfiletoqueue), то единственный выход - курсор.

Ещё, правда, можно собрать строку с вызовами dbo.gen_addfiletoqueue, и выполнить её за один раз. Может быть, это будет быстрее.
6 авг 14, 13:35    [16406315]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
BuKTaP
Я так понимаю, что нет. Если бы было можно - уже подсказали бы.
Можно, только не нужно. Потому что будут затрачены значительные ресурсы на компиляцию большого пакета.
Но если количество строк небольшое, можете сконкатенировать их с разделителем ";" и отправить результат на выполнение.
6 авг 14, 13:36    [16406319]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Расскажу, как всё устроено в двух, хотя это и ни к чему :)
Есть данные по компаниям, которые собраны в xml файлах.
При изменении каких-либо данных, связанных с компаниями, изменения дописываются в виде куска xml (около 60 ХП генерят эти куски по разным данным для компаний), который в последствии влияет на первоначальный файл. Когда изменений много - начинаются проблемы с производительностью. Поэтому было решено (не мной) в случае большого количества изменений, уйти от обработки отдельных кусков xml и перегенеривать весь файл заново. Эта ХП добавляет в очередь компанию на перегенерацию и используется не только мной, но и другими ХП, которые могут передавать не таблицу, а один параметр.
Мне дана возможность изменения только одной из процедур, в которой после некоторых подсчётов и будет вызываться "добавление в очередь".

Так собственно ответьте, пожалуйста: без курсора не обойтись?
6 авг 14, 13:42    [16406378]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Всё понял, всем спасибо. Курсор, значит курсор.
Но всё-таки было бы интересно послушать варианты:
alexeyvg
Ещё, правда, можно собрать строку с вызовами dbo.gen_addfiletoqueue, и выполнить её за один раз. Может быть, это будет быстрее.

и
invm
Но если количество строк небольшое, можете сконкатенировать их с разделителем ";" и отправить результат на выполнение.

и
Glory
Можете. Только заметно быстрее от этого не станет


Эти три варианта - одно и то же, что вы имели ввиду?
6 авг 14, 13:46    [16406423]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
BuKTaP,

declare @t table (id int identity primary key, s nvarchar(100));

insert into @t (s) values (N'select 1'), (N'select 2'), (N'select 3');

declare @s nvarchar(max);

select @s = (select s + '; ' from @t order by id for xml path(''), type).value('.', 'varchar(max)');
exec(@s);
6 авг 14, 14:27    [16406758]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
invm
BuKTaP,

declare @t table (id int identity primary key, s nvarchar(100));

insert into @t (s) values (N'select 1'), (N'select 2'), (N'select 3');

declare @s nvarchar(max);

select @s = (select s + '; ' from @t order by id for xml path(''), type).value('.', 'varchar(max)');
exec(@s);
Всё-таки, точнее везде NVARCHAR(MAX)
6 авг 14, 14:29    [16406776]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8316
BuKTaP , если спамить вызовы процедур, то Вы рискуете стать человеком, создавшим самую медленную обработку данных.
Распотрошите процедуру gen_addfiletoqueue и Создайте не ее основе новую процедуру. Измените ее так, чтобы она из cmd выгребала параметры запуска в таблицу, затем измените запросы процедуры так, чтобы они использовали полученную таблицу.

Например вместо
update tbl1 ... where dd = @a

получите

update ... from tbl1 inner join параметры on tbl1.dd = параметры.dd

Одним махом прибиваются все зайцы.
6 авг 14, 14:43    [16406881]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Всем спасибо, сделал через курсор.
6 авг 14, 16:33    [16407721]     Ответить | Цитировать Сообщить модератору
 Re: execute  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
BuKTaP
Эти три варианта - одно и то же, что вы имели ввиду?
Ага
6 авг 14, 19:30    [16408488]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить