在同一查询中,Azure devops powershell提供的结果与本地powershell不同

时间:2018-10-08 12:56:29

标签: azure powershell azure-devops azure-pipelines azure-pipelines-build-task

我在项目中有此postDacPac文件,该文件在部署过程中运行。它具有存储过程,有时可能会引发错误。我创建了一个具有以下类似结构的模拟存储过程:

CREATE PROCEDURE #tmpSproc
AS
BEGIN
    BEGIN TRANSACTION
        print 'Enter sproc';
        IF @@TRANCOUNT > 0
        BEGIN
            print 'Rollback in sproc.'
            ROLLBACK TRANSACTION
        END;
        THROW 60000, 'Temp error.', 0

END
GO

在postDacPac文件中,我使用如下所示的sproc:

CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
BEGIN TRANSACTION
GO

IF 1=1 /* It is called in an if condition so I kept the structure same. */
BEGIN
    EXEC #tmpSproc;
END
GO

IF @@ERROR <> 0 AND @@TRANCOUNT > 0
BEGIN
    PRINT N'Rollback after sproc.'
    ROLLBACK TRANSACTION;
END

IF @@TRANCOUNT = 0
BEGIN
    PRINT N'Creating error entry'
    INSERT  INTO #tmpErrors (Error)
    VALUES                  (1);
    BEGIN TRANSACTION;
END
ELSE
    PRINT N'sproc succeeded or skipped.'
GO

IF EXISTS (SELECT * FROM #tmpErrors)
BEGIN
    PRINT N'Rollback after deployment.'
    ROLLBACK TRANSACTION
END
GO
IF @@TRANCOUNT>0 BEGIN
PRINT N'success'
COMMIT TRANSACTION
END
ELSE PRINT N'fail'
GO
DROP TABLE #tmpErrors
GO
DROP PROCEDURE #tempSproc
GO

我使用以下脚本在powershell上运行它:

Invoke-Sqlcmd -ConnectionString "myConnectionString"  -Inputfile "C:\***\PostDacPac.sql" -QueryTimeout 6000 -Verbose -ErrorVariable errors 

在powershell上,它按预期工作。即使存储过程引发错误并回滚,查询仍将继续直到结束并打印脚本失败。

但是,当我在azure devops管道(vsts)上尝试此部署时,如果sproc失败,则部署也会失败。这是azure powershell调用此文件的方式:

Invoke-Sqlcmd -ServerInstance "***" -Database "***" -Username "***"  -Password ****  -Inputfile "D:\***\PostDacPac.sql" -QueryTimeout  6000 -ConnectionTimeout 120

我尝试检查过天蓝色devops中的所有管道设置,但找不到任何区别。在这个范围内我可能会缺少什么?

1 个答案:

答案 0 :(得分:0)

原来,查询超时后,脚本又以某种方式运行。显然,这是一个已知问题。也有与此相关的几个问题,例如:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d4167226-2da7-49ec-a5c2-60e964785c2c/powershell-invokesqlcmd-calls-stored-procedure-second-time-after-query-timeout-is-expired?forum=sqldatabaseengine