Выполнение долго работающего SQL из MSBuild

#msbuild #sqlcommand

#msbuild #sqlcommand

Вопрос:

Я хочу реализовать процесс для вызова долго работающего 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 как часть процесса сборки после развертывания для заполнения данных в более низких средах.

Комментарии:

1. Возможно, попробуйте другую задачу или напишите свою собственную для тестирования с помощью встроенной задачи.

Ответ №1:

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

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="SqlExecute" AssemblyFile="C:UsersIlya.KozhevnikovDropboxMSBuildExtensionPackSolutionsMainBuildBinariesMSBuild.ExtensionPack.dll" />

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