Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 выполнить команды из таблицы без курсора  [new]
без курсора
Guest
в таблице записаны команды на запуск процедур (exec) с уже заполненными параметрами.
как можно без курсора их все выполнить? (порядок выполнения неважен)
28 мар 12, 15:34    [12328021]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
declare @sql nvarchar (max) = ''

select @sql += a.[поле, где записаны команды на запуск процедур] from [таблице записаны команды на запуск процедур] a

exec ( @sql )


Сообщение было отредактировано: 28 мар 12, 16:42
28 мар 12, 15:35    [12328031]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
лучше
declare @t table ( src varchar(100) )
declare @script varchar(max) ;
insert  into @t
        ( src )
values  ( 'exec sp1 @p=100' ),
        ( 'exec sp2 @pzzz = 100500' ) ;
with  zz ( z )
        as ( select src + ';' 'text()'
             from   @t
             for    xml path('')
                      , type
           )
  select  @script = z.value('.', 'varchar(max)')
  from    zz
select  @script
--exec(@script)
28 мар 12, 16:01    [12328282]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Гавриленко Сергей Алексеевич,

надо бы разделитель между командами добавлять?
Ну, точку с запятой, например...
28 мар 12, 16:02    [12328297]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iap
Гавриленко Сергей Алексеевич,

надо бы разделитель между командами добавлять?
Ну, точку с запятой, например...
Да, забыл. Но идею пояснил. :)
28 мар 12, 16:42    [12328664]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
Гавриленко Сергей Алексеевич
declare @sql nvarchar (max) = ''

select @sql += a.[поле, где записаны команды на запуск процедур] from [таблице записаны команды на запуск процедур] a

exec ( @sql )


у меня команды уже с ';' записаны, так что все ок.
а что за запись такая, '+=' ?
это сокращенно то же самое что и @sql = @sql + ...?
а вроде ж недокументировано собирать в переменную, или уже официально разрешено в 2008?
28 мар 12, 16:56    [12328826]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
без курсора
Гавриленко Сергей Алексеевич
declare @sql nvarchar (max) = ''

select @sql += a.[поле, где записаны команды на запуск процедур] from [таблице записаны команды на запуск процедур] a

exec ( @sql )


у меня команды уже с ';' записаны, так что все ок.
а что за запись такая, '+=' ?
это сокращенно то же самое что и @sql = @sql + ...?
а вроде ж недокументировано собирать в переменную, или уже официально разрешено в 2008?
По-прежнему недокументировано.
+= - этот оператор появился в SQL2008. Аналогичен такому же в C, например.
28 мар 12, 17:15    [12328987]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
iap,

спасибо
28 мар 12, 17:30    [12329086]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
ситуация осложнилась,
надо выполнить все команды,
и даже если некоторые не выполнились,
продолжать выполнять оставшееся.
т.е. сбор в переменную не подходит.
значит, курсор?
30 мар 12, 14:43    [12340475]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
без курсора,

а почему сбор в переменную не подходит?
у вас что выдаст
exec ('declare @a int = 5; print @a; print @a / 0; set @a += 17; print @a')
?
30 мар 12, 14:48    [12340541]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Shakill
exec ('declare @a int = 5; print @a; print @a / 0; set @a += 17; print @a')
А такая?

exec ('declare @a int = 5; print @a; print a / 0; set @a += 17; print @a')
30 мар 12, 15:04    [12340699]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
alexeyvg,

ну да, ошибки разные бывают, я предположил простой случай )
вообще мы не знаем что там за процедуры у автора
30 мар 12, 15:11    [12340755]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
Shakill,
у меня выполнение прерывалось при выполнении exec sp_refreshview ...
который ссылается на несуществующую таблицу.

без курсора теперь вы глядит так:
declare @t table (id int identity, sql_ nvarchar(255));
declare @n int;
declare @sql nvarchar(255);

insert into @t
select sql_ from ttt 

select @n = max(id) from @t;

while @n > 0
	begin
	   select @sql = sql_ from @t where id = @n;
	   print @n;
	   
	   begin try
		   exec (@sql);
	   end try

		begin catch
			select error_message() as err, 
			       sql_ as cmd
			from @t where id = @n;
			rollback;
		end catch	

	   set @n = @n - 1;  
	end

 


поди проще можно
30 мар 12, 15:14    [12340785]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
без курсора,
rollback; есть
begin tran,commit где?
30 мар 12, 15:22    [12340875]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
вопрос по ходу дела.
я нигде явно транзакции не открываю.
почему если в catch не написать rollback или commit,
то когда он не смог вью обновить, получаю
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
30 мар 12, 15:24    [12340903]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
без курсора,

ну этот цикл получается как имитация курсора
30 мар 12, 15:27    [12340941]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
без курсора
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
Потому что надо сначала завалившуюся транзакцию откатить.
30 мар 12, 15:28    [12340944]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
denis2710,
вот я про то и говорю.
я явно транзакцию не открываю,
и никакой rollback мне не нужен.
это такой костыль, чтоб не получать то сообщение.
мне бы и в голову не пришло писать rollback,
пока он не пожаловался, что сам транзакцию не может закоммитить.
раз не может, то и пишу ему rollback.
30 мар 12, 15:29    [12340955]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
Shakill
без курсора,

ну этот цикл получается как имитация курсора


вот, т.е. все равно шило на мыло.
проще как-то нельзя?
собственно, отрабатывает быстро и вроде блокировать ничего не должен,
наверное и так сойдет
30 мар 12, 15:31    [12340992]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
без курсора, ну можно для надежности проверить @@trancount до rollback
30 мар 12, 15:32    [12341002]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
без курсора,

да куда уж проще, цикл и try exec. оставьте так или курсор фастфорвард и не мучайтесь, это как раз тот случай.
30 мар 12, 16:12    [12341431]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
iljy
Member

Откуда:
Сообщений: 8711
без курсора,

declare @t table ( src varchar(100) )
declare @script varchar(max) ;
insert  into @t
        ( src )
values  ( 'exec sp_lock @spid1 = null' ),
        ( 'exec sp2 @pzzz = 100500' ),
        ( 'exec sp_who' ) ;
with  zz ( z )
        as ( select 'exec(''' + src + ''');' + CHAR(10)
             from   @t
             for    xml path('')
                      , type
           )
  select  @script = z.value('.', 'varchar(max)')
  from    zz
exec( @script)
30 мар 12, 21:04    [12343220]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
без курсора
Guest
iljy,

попробую завтра на свежую голову разобраться.
пока что неправильно собирается строка,
потому что в ней уже есть кавычки в том самом sp_refreshview.
получается примерно такое:
exec('EXEC sp_refreshview 'dbo.[Customer and Suppliers by City]'');
exec('EXEC sp_refreshview 'dbo.[Alphabetical list of products]'');
...


и уже голова не варит, где и как что удвоить,
чтоб с кавычками отрабатывало и без тоже
30 мар 12, 22:41    [12343628]     Ответить | Цитировать Сообщить модератору
 Re: выполнить команды из таблицы без курсора  [new]
iljy
Member

Откуда:
Сообщений: 8711
без курсора,

а чего тут соображать?
declare @t table ( src varchar(100) )
declare @script varchar(max) ;
insert  into @t
        ( src )
values  ( 'exec sp_lock @spid1 = null' ),
        ( 'exec sp2 @pzzz = 100500' ),
        ( 'exec sp_who ''sa''' ) ;
with  zz ( z )
        as ( select 'exec(''' + replace(src, '''', '''''') + ''');' + CHAR(10)
             from   @t
             for    xml path('')
                      , type
           )
  select  @script = z.value('.', 'varchar(max)')
  from    zz
exec( @script)
31 мар 12, 01:40    [12344059]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить