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

Откуда:
Сообщений: 109
Подскажите пжл решение след. ситуации:

имеем вызов задания, которое в свою очередь запускат пакет SSIS.
DECLARE @return_value int
EXEC @return_value = msdb.dbo.sp_start_job N'Пакет "Кластеризация точек"' ;
GO
WAITFOR DELAY '00:00:05'
GO

и дальше к.т. код
Select *...

Почему то код НЕ дожидается исполнения задания и идет дальше к следующей команде, что нарушает обработку данных.
Приходиться пользоваться WAITFOR DELAY '00:00:05'

Есть более красивое решение?
М.б. есть какая-то "системная" опция, обязывающая дожидаться завершения выполнения предыдущей команды?

Спасибо.
24 май 09, 14:23    [7219908]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
aleks2
Guest
Job, вопче то, запускается и выполняется в подключении SQLAgent-а. Т.е. АСИНХРОННО.
Юзай sp_helpjob или чо-то подобное (BOL под рукой нема) для возврата и обработки состояния job-а.
24 май 09, 14:42    [7219933]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
ChA
Member

Откуда: Москва
Сообщений: 11319
namenike
имеем вызов задания, которое в свою очередь запускат пакет SSIS.
DECLARE @return_value int
EXEC @return_value = msdb.dbo.sp_start_job N'Пакет "Кластеризация точек"' ;
GO
WAITFOR DELAY '00:00:05'
GO

и дальше к.т. код
Select *...

Почему то код НЕ дожидается исполнения задания и идет дальше к следующей команде, что нарушает обработку данных.
Приходиться пользоваться WAITFOR DELAY '00:00:05'
А почему он должен дожидаться-то ? Он выполнился, запустил работу и закончился. Когда же закончиться job, ему всё равно, тот ведь, грубо говоря, в своём отдельном потоке выполняется.

Вариантов всяких много, но только не "WAITFOR DELAY". Ну, например, оформить скрипт job-а как процедуру, и вместо запуска job-а запускать эту процедуру. А если нужно, чтобы она ещё и в job работала, то в нём вызывать ту же процедуру.
24 май 09, 14:47    [7219942]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
namenike
Member

Откуда:
Сообщений: 109
Про ассихронность согласен,
НО
ведь после EXEC стоит присваивание результатов работы job-а переменной.

Можно как-то "сказать" T-SQL-ю, что
"пока присваивание НЕ произойдет - к след. операции НЕ переходить" ?
24 май 09, 15:32    [7220006]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
namenike
Про ассихронность согласен,
НО
ведь после EXEC стоит присваивание результатов работы job-а переменной.

Там стоит вернуть результат попытки запуска job-а. А не результат его работы
Вы разве не проичтали это в статье про sp_start_job ?
24 май 09, 15:36    [7220010]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
namenike
Member

Откуда:
Сообщений: 109
ChA, подскажите пжл еще варианты,
т.к. запуск джоба из процедуры все рано не дает нужого результата

М.б. есть возможность получать результат ВЫПОЛНЕНИЯ джоба?
24 май 09, 16:40    [7220085]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
ChA
Member

Откуда: Москва
Сообщений: 11319
namenike
ChA, подскажите пжл еще варианты,
т.к. запуск джоба из процедуры все рано не дает нужого результата

М.б. есть возможность получать результат ВЫПОЛНЕНИЯ джоба?
Подозреваю, что Вы меня неправильно поняли. Я нигде не предлагал запускать джоб из процедуры, скорее, наоборот. Могу только ещё раз процитировать.
ChA
оформить скрипт job-а как процедуру, и вместо запуска job-а запускать эту процедуру. А если нужно, чтобы она ещё и в job работала, то в нём вызывать ту же процедуру.
24 май 09, 17:59    [7220180]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
namenike
Member

Откуда:
Сообщений: 109
ChA, думаю, вопрос можно сформулировать по иному, т.к.

- Есть внешнее приложение, вызывающее ХП
- в последней строке ХП стоит вызов пакета
- ХП-ке нужно вернуть код завершения, например 0 - все "ок"
- но этот "ок" зависит в том числе от результатов работы джоба
т.е. в ХП полюбому нужно дождаться окончания джоба и получить код его завершения

Т.о., имхо, вопрос формулируется так:
как получить код завершения джоба в ХП, запустившей этот джоб ?
24 май 09, 19:37    [7220305]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
namenike
Т.о., имхо, вопрос формулируется так:
как получить код завершения джоба в ХП, запустившей этот джоб ?
Можно использовать процедуру sp_help_jobhistory

Вызвать её до запуска джоба, запомнить id последнего выполнения, а потом вызывать её после, ожидая появления новой записи.
24 май 09, 20:19    [7220353]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Service Broker для таких вещей придуман.
24 май 09, 22:38    [7220525]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
namenike
Member

Откуда:
Сообщений: 109
DeColo®es, можно по подробнее пжл.
25 май 09, 06:46    [7220853]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Например, тут.
Язык, конечно корявый, с первого раза и испугаться можно.. ;)
25 май 09, 11:12    [7221681]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
Lust
Member

Откуда:
Сообщений: 5
Как-то давненько нацарапал следующий код.
Возможно поможет.

---------------------------------------------------------------------------------------------------
-- Ожидает окончание выполнения sql агентом указанного задания (job).
---------------------------------------------------------------------------------------------------
-- 
-- Пример вызова с использованием имени задания -- 
-- 
-- declare @job_name nvarchar(64) set @job_name = N'Job 0001'
-- exec msdb.dbo.sp_start_job         @job_name = @job_name 
-- exec msdb.dbo.sp_wait_job_activity @job_name = @job_name 
-- 
---------------------------------------------------------------------------------------------------
-- 
-- Пример вызова с использованием идентификатора задания -- 
-- 
-- declare @job_id nvarchar(64)   set @job_id = N'2E9ADA19-23E3-4C30-B7D6-5289E87060D6'
-- exec msdb.dbo.sp_start_job         @job_id = @job_id 
-- exec msdb.dbo.sp_wait_job_activity @job_id = @job_id 
-- 
---------------------------------------------------------------------------------------------------
--
-- Пример вызова нескольких заданий с использованием имени задания -- 
--
-- declare @job_name nvarchar(64) 
-- 
-- set @job_name = N'Job 0001'
-- exec msdb.dbo.sp_start_job         @job_name = @job_name 
-- exec msdb.dbo.sp_wait_job_activity @job_name = @job_name 
-- 
-- set @job_name = N'Job 0002'
-- exec msdb.dbo.sp_start_job         @job_name = @job_name 
-- exec msdb.dbo.sp_wait_job_activity @job_name = @job_name 
-- 
-- set @job_name = N'Job 0003'
-- exec msdb.dbo.sp_start_job         @job_name = @job_name 
-- exec msdb.dbo.sp_wait_job_activity @job_name = @job_name 
--
---------------------------------------------------------------------------------------------------

use [msdb]
go

set ansi_nulls on
go
set quoted_identifier off
go

if exists ( 
	select * from sys.objects 
	where object_id = object_id( N'[dbo].[sp_wait_job_activity]') and type in ( N'P', N'PC' ) 
)
begin
	drop procedure [dbo].[sp_wait_job_activity]
end
go

---------------------------------------------------------------------------------------------------
-- Ожидает окончание выполнения sql агентом указанного задания (job).
---------------------------------------------------------------------------------------------------
create procedure [dbo].[sp_wait_job_activity]
	@job_id   uniqueidentifier = NULL,  -- If provided should NOT also provide job_name
	@job_name sysname          = NULL   -- If provided should NOT also provide job_id
as
begin
	set nocount on

	select @job_name = ltrim(rtrim(@job_name))
	if (@job_name = N'') select @job_name = null

	if ( (@job_id is not null) or (@job_name is not null) )
	begin
		declare @retval int

		execute @retval = sp_verify_job_identifiers '@job_name',
                                                    '@job_id',
                                                     @job_name output,
                                                     @job_id   output
		if (@retval <> 0) return(1) 
	end
  
	while 0 = (
		select
			isnull( jh.run_status, 0 ) 
		from
			(msdb.dbo.sysjobactivity as ja with (nolock) 
			left join msdb.dbo.sysjobhistory as jh with (nolock) on ja.job_history_id = jh.instance_id)
			join msdb.dbo.sysjobs_view as j with (nolock) on ja.job_id = j.job_id
		where
			ja.job_id = ( select job_id from msdb.dbo.sysjobs with (nolock) where [name] = @job_name )
			and
			ja.session_id = ( select top(1) session_id from syssessions with (nolock) order by agent_start_date desc  )
	)
	begin
		waitfor delay '00:00:05'
	end

	return(0)
end

---------------------------------------------------------------------------------------------------
-- end of script -- 
---------------------------------------------------------------------------------------------------
1 июн 09, 11:59    [7250648]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
namenike
Member

Откуда:
Сообщений: 109
Lust, СПАСИБО - то, что нужно!
1 июн 09, 19:00    [7253202]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Ожидание выполнения команды в T-SQL  [new]
SergeV
Member

Откуда:
Сообщений: 144
Интересовал тот же вопрос, тема очень помогла.

В продолжение темы возник вопрос - как получить код возврата процедуры sp_start_job ?
То есть нужно понять не только сам факт завершения задания, но и с каким кодом (с ошибкой или с успехом) завершилось задание.
Как это сделать не понимаю. Можно конечно понять по столбцу message, но хотелось бы код.
27 апр 12, 15:05    [12480343]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
SergeV
В продолжение темы возник вопрос - как получить код возврата процедуры sp_start_job ?
Перечитайте ещё раз тему.

Процедура sp_start_job возвращает код (с ошибкой или с успехом) запуска задания, а не его завершения.

И осторожнее с "тема очень помогла", с такими способами нужно аккуратно. Например, код в последнем посте, который namenike с успехом где то использовал, показывает результат последнего запуска, а не того, который был сделан в этой процедуре.
28 апр 12, 00:03    [12482778]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
Virus квартирус
Member

Откуда: Москва
Сообщений: 41
alexeyvg
Например, код в последнем посте, который namenike с успехом где то использовал, показывает результат последнего запуска, а не того, который был сделан в этой процедуре.


В таких случаях нужно создавать собственный job на каждый запрос, а после выполнения удалять его.
Тогда гарантированно получим правильный результат.
28 апр 12, 09:14    [12483473]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Virus квартирус
alexeyvg
Например, код в последнем посте, который namenike с успехом где то использовал, показывает результат последнего запуска, а не того, который был сделан в этой процедуре.


В таких случаях нужно создавать собственный job на каждый запрос, а после выполнения удалять его.
Тогда гарантированно получим правильный результат.
В этом случае да, будет правильный результат.

Но непонятно, зачем вообще нужно использовать джобы для синхронного выполнения чего-либо?

Я ещё понял бы, если нужно было-бы запускать много параллельных задач, но вроде об этом не говорилось.
Ну и ещё экзотические случаи есть, типа запуск задачи от имени прокси-аккаунта...
28 апр 12, 09:59    [12483667]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
SergeV
Member

Откуда:
Сообщений: 144
[quot alexeyvg]
SergeV
показывает результат последнего запуска, а не того, который был сделан в этой процедуре.


Я гарантировано знаю, что никакая другая процедура не запускает этот job.
Если еще проанализировать время запуска, сравнив с текущим временем, то можно понять что найден именно этот запуск.
28 апр 12, 13:50    [12485240]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
SergeV
Member

Откуда:
Сообщений: 144
[quot alexeyvg]
Virus квартирус
Но непонятно, зачем вообще нужно использовать джобы для синхронного выполнения чего-либо?


Я запускаю job из макроса excel.
В задании находятся вызовы sql-процедур и ssis-пакеты.
28 апр 12, 13:54    [12485265]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
SergeV
Member

Откуда:
Сообщений: 144
alexeyvg
Процедура sp_start_job возвращает код (с ошибкой или с успехом) запуска задания, а не его завершения.


Да, я неправильно понял смысл вызова sp_verify_job_identifiers. Я подумал, что это проверка того, запустилось ли задание, а не того что оно выполнилось.
28 апр 12, 14:08    [12485359]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
Virus квартирус
Member

Откуда: Москва
Сообщений: 41
В базе msdb таблице dbo.sysjobhistory есть поле run_status.
У него такие значения:

0 = Сбой.
1 = Выполнено.
2 = Повтор.
3 = Отменено.
4 = Выполняется.

Вот Вам и коды.
28 апр 12, 14:09    [12485366]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
SergeV
alexeyvg
Но непонятно, зачем вообще нужно использовать джобы для синхронного выполнения чего-либо?


Я запускаю job из макроса excel.
В задании находятся вызовы sql-процедур и ssis-пакеты.
Понятно.

Ну, получить ошибку можно из таблицы sysjobhistory, выше же есть пример. Там есть не только поле message, но и номер ошибки и прочее.
28 апр 12, 14:11    [12485380]     Ответить | Цитировать Сообщить модератору
 Re: Ожидание выполнения команды в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
Virus квартирус
Вот Вам и коды.
Наверное, имелись в виду коды сиквельной ошибки, если она была. Но в этой таблице есть и такие.
28 апр 12, 14:12    [12485386]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить