代码之家  ›  专栏  ›  技术社区  ›  Thangadurai

Powershell Invoke Sqlcmd在发生错误后从头重新启动脚本

  •  0
  • Thangadurai  · 技术社区  · 6 年前

    我有一个 .sql 与下面类似的文件

    BEGIN TRY
       PRINT 'Loading master data....'
       BEGIN TRANSACTION
    
       -- Some Insert scripts
       -- COPY Settings from DBOne to DBTwo
    
       PRINT 'Copy Settings Started...'
       INSERT INTO DBTWO.dbo.SETTINGS
       (Id,
        Code,
        Name)
       SELECT Id,Code,Name FROM DBONE.dbo.SETTINGS
       EXCEPT
       SELECT Id,Code,Name FROM DBTWO.dbo.SETTINGS
    
       PRINT 'Copy Settings completed...'
    
       COMMIT
    END TRY
    BEGIN CATCH
       ROLLBACK
    END CATCH
    

    我正在使用以下powershell命令调用sql脚本

    Invoke-Sqlcmd -ServerInstance ".\" -InputFile ".\Insert_Script.sql" -Verbose

    但问题是,为什么脚本从一开始就重新启动,在第二次运行时在同一位置失败。在这个阶段,我甚至检查了sp_who2,它显示了一个死锁,受害者和罪犯都是同一个脚本块。因此,有了所有这些解释,问题仍然没有答案是‘为什么脚本又开始了?’

    有人能为这种行为提供更好的理由吗。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Thangadurai    6 年前

    看起来这是SQL Server本身的问题。微软已经在网站上确认了这个问题 https://support.microsoft.com/en-us/help/4010159/fix-invoke-sqlcmd-cmdlet-executes-a-query-statement-multiple-times-if

    要解决此问题,建议的解决方案是安装上述链接中提到的更新。

    由于我的SQL server版本是2016年,我安装了service pack SP2和SP2的最新累积更新(CU11)。安装之后,我运行了脚本,它在第一次运行时失败,并正确抛出了预期的错误(“无效的对象名…)

    SO 帖子帮助我找到了上面的链接。