Выполнение долго выполняющегося SQL из MSBuild

Я хочу реализовать процесс для вызова долго работающего sql SPROC (он заполняет много данных в некоторых таблицах) с помощью MSBuild. У меня есть следующий код для вызова SPROC с моего сервера сборки

    <Target Name="Test"  AfterTargets="Deploy">
    <MSBuild.ExtensionPack.SqlServer.SqlExecute TaskAction="ExecuteRawReader" Sql="DECLARE  @return_value int, @Result nvarchar(1000) EXEC  @return_value = [dbo].[usp_ProcessWarehouse] @Result = @Result OUTPUT SELECT    @Result as N'@Result' SELECT    'Return Value' = @return_value"
        ConnectionString="Data Source=localhost;Initial Catalog=ETL;Integrated Security=True;Connection Timeout=10000">
        <Output PropertyName="RawResult" TaskParameter="RawReaderResult"/>
    </MSBuild.ExtensionPack.SqlServer.SqlExecute>
    <Message Text="$(RawResult)"/>
</Target>

SPROC выглядит следующим образом

ALTER PROCEDURE [dbo].[usp_ProcessWarehouse]
   @Result Nvarchar(1000) OUTPUT
AS
EXEC msdb.dbo.sp_start_job N'MB_ProcessWarehouse'
WaitFor Delay '00:00:05'
Declare @cnt int = 0
WHILE (@cnt <> 5)
BEGIN    
   set @cnt =   (
                 SELECT count(*)
                 FROM msdb.dbo.sysjobactivity AS sja
                 INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
                 WHERE sja.start_execution_date IS NOT NULL
                 AND sja.stop_execution_date IS NULL)
                 if @cnt = 0
                 Begin
                 set  @cnt = 5
                 Break
                 End
                 Print 'Job Still Running'
                 WaitFor Delay '00:00:05'
END
Print 'Job Completed'

Set @result = (
               SELECT top 1
               CASE jh.run_status WHEN 0 THEN 'Failed'
               WHEN 1 THEN 'Success'
               WHEN 2 THEN 'Retry'
               WHEN 3 THEN 'Canceled'
               WHEN 4 THEN 'In progress'
               END AS Status
               FROM msdb.dbo.sysjobs j 
               INNER JOIN msdb.dbo.sysjobhistory jh 
               ON jh.job_id = j.job_id AND jh.step_id = 0 
               inner join msdb.dbo.syscategories sc
               on j.category_id = sc.category_id
               WHERE j.[name] like 'MB_ProcessWarehouse'
               order by jh.run_date desc, jh.run_time desc
               )

Таким образом, в основном этот SPROC запускает некоторый SQL, чтобы запустить задание, затем проверяет, когда оно завершится, и проверяет его статус. Работа может занять 30 минут.

Фактическая цель вызывается и запускает задание, однако задача msbuild завершается с ошибкой.

SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding

Я пробовал несколько вещей, таких как изменение тайм-аута для SQL в реестре, но я все еще получаю эту ошибку через 60 секунд. Есть ли способ обойти это? Или есть лучший способ сделать то, что я пытаюсь сделать. Я хочу запустить этот SPROC как часть процесса сборки после развертывания для заполнения данных в более низких средах.


person Isaac Levin    schedule 25.06.2014    source источник
comment
Возможно, попробуйте другую задачу или напишите свою собственную для тестирования со встроенной задачей.   -  person Sayed Ibrahim Hashimi    schedule 26.06.2014


Ответы (1)


ConnectionTimeout здесь не имеет значения, вы ищете CommandTimeout, свойство задачи.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="SqlExecute" AssemblyFile="C:\Users\Ilya.Kozhevnikov\Dropbox\MSBuildExtensionPack\Solutions\Main\BuildBinaries\MSBuild.ExtensionPack.dll" />

    <Target Name="Foo">
        <SqlExecute
            TaskAction="ExecuteRawReader"
            Sql="WAITFOR DELAY '00:00:31'"
            ConnectionString="Integrated Security=true"
            CommandTimeout="32"
        />
    </Target>
</Project>
person Ilya Kozhevnikov    schedule 26.06.2014