#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>