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

Откуда: Ukraine, Kiev
Сообщений: 105
Люди, помогите!

Задача выглядит так:
в процедуре
формируются SQL-командные файлы (для разных серверов)
и запускаются на выполнение exec master..xp_cmdshell 'osql ...'

Что плохо - команды ваполняются долго, А УПРАВЛЕНИЕ ВОЗВРАЩАЕТСЯ В ПРОЦЕДУРУ ПОСЛЕ ОКОНЧАНИЯ КОМАНДНОГО ФАЙЛА!

Получается, они отрабатывают ПО ОЧЕРЕДИ! БЛИН.

Вопрос - как в вызове exec master..xp_cmdshell породить независимый поток выполнения Windows для запуска OSQL.
В смысле, чтоб управление сразу вернулось в процедуру.

Помогите, за ночь обновления для клиентов не успевают сформироваться...
20 янв 05, 18:06    [1262030]     Ответить | Цитировать Сообщить модератору
 Re: Возврат управления из команд операционки в процедуру  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Вместо запуска "osql.exe <параметры>" используйте "start osql.exe <параметры>". Start запускает программу и сразу же выходит, не дожидаясь завершения.
20 янв 05, 19:22    [1262220]     Ответить | Цитировать Сообщить модератору
 Re: Возврат управления из команд операционки в процедуру  [new]
Chaklun
Member

Откуда: Ukraine, Kiev
Сообщений: 105
to GreenSunrise
прошу прощения, не предупредил
насчет start - пробовал - никаково эффекта...
даже обалдел сначала :)

Тему можно считать закрытой.
солюшн тут
http://www.databasejournal.com/features/mssql/article.php/10894_3427581_2

подсказали ребята с http://www.sqlservercentral.com/forums/shwmessage.aspx?forumid=8&messageid=156715#top

исчерпывающая статья!
20 янв 05, 19:26    [1262231]     Ответить | Цитировать Сообщить модератору
 Re: Возврат управления из команд операционки в процедуру  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
Не знаю, поможет это или нет, попробуйте все необходимые запуски на выполнение, типа exec master..xp_cmdshell 'osql ...', из t-sql переместить в файл.cmd, а в t-sql оставить один запуск этого cmd-файла. Проиллюстрирую идею
--этот код будет выполняться ~5 мин.
waitfor delay '00:01'
waitfor delay '00:01'
waitfor delay '00:01'
waitfor delay '00:01'
waitfor delay '00:01'
Создадим файл test-win-multiproc-osql.cmd со следующим содержимым (создание файла при необходимости можно автоматизировать):
@echo off
start osql -E -Q "waitfor delay '00:01'"
start osql -E -Q "waitfor delay '00:01'"
start osql -E -Q "waitfor delay '00:01'"
start osql -E -Q "waitfor delay '00:01'"
start osql -E -Q "waitfor delay '00:01'"
Ну, и теперь
--этот код будет выполняться ~1 мин.
exec master..xp_cmdshell 'C:\...\test-win-multiproc-osql.cmd'
В WinTaskManagere/Processes можно полюбоваться всеми пятью процессами...
20 янв 05, 19:31    [1262238]     Ответить | Цитировать Сообщить модератору
 Re: Возврат управления из команд операционки в процедуру  [new]
Chaklun
Member

Откуда: Ukraine, Kiev
Сообщений: 105
TO LR:
Спасибо!
Метод работающий, но требует лишних телодвижений.
В статье (см. предыдущий пост) я нашел более элегантный подход.
оформил это все уже как хранимку

TO ALL:

create proc ps_RunAsyncOSQL( @osql_cmd varchar(1000) )
as

--submit slow SQL-code asynchronously
declare @rc int --return value
declare @object int --wscript.shell
declare @src varchar(255)
declare @desc varchar(255)
--declare @osql_cmd varchar(1000)

-- create shell object 
exec @rc = sp_oacreate 'wscript.shell', @object out
if @rc <> 0
begin
  --show error with description
  exec sp_oageterrorinfo @object, @src out, @desc out
  select hr=convert(varbinary(4),@rc), source=@src, description=@desc
  return
end

-- submit slow code asyncronously
exec @rc=sp_oamethod @object, 'run', null, @osql_cmd
print @rc
if @rc <> 0
begin
 exec sp_oageterrorinfo @object, @src out, @desc out 
 select hr=convert(varbinary(4),@rc), source=@src, description=@desc
 exec sp_oadestroy @object
 return
end

-- destroy shell object
exec sp_oadestroy @object

GO

В принципе, можно не только OSQL запускать - а произвольный набор команд операционки :) асинхронно.
В любом случае - спасибо LR за еще один метод.
21 янв 05, 13:05    [1264096]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить