首页 > 解决方案 > PowerShell - 如果所有 Invoke-SQL 命令都成功,如何提交范围

问题描述

我正在使用 PowerShell 版本 5,并且正在 PowerShell 脚本中执行几个 SQL 命令。与我们在BEGIN TRANSACTIONCOMMIT TRANSACTION中执行命令的 SQL Server 不同,如果单个命令失败,所有内容都会回滚,我想在我的 Powershell 脚本中实现类似的功能。

因此,在我的场景中,如果有 3 个 SQL 命令失败,则不应删除该表:

在插入记录时,我尝试使用数组插入多行并测试范围的工作,因此我有意添加重复的 Id 值,因此预期结果是如果 Id 即第一个数组元素有效,则继续下一个元素,但如果第二个数组元素无效,然后回滚更改。

但是由于我对 Powershell 的了解有限,因此不确定如何实现这一点,因此即使 Id 不重复或重复,会话也不会被提交。

到目前为止,以下是我的脚本:

$connString = "Data Source=<Server-Name>;Database=<DB-Name>;User ID=<Login>;Password=<Pass>"
 
 
  $conn = New-Object System.Data.SqlClient.SqlConnection $connString
  $arr_values = @('1','1') 
  $tbl_name = "dbo.test1"
 
  $conn.Open()
  try
  {
    if($conn.State -eq "Open")
    {         
     foreach ($Id in $arr_values) 
     {
        $scope = New-Object -TypeName System.Transactions.TransactionScope
       
        $Drop_Command= "DROP Table IF EXISTS $tbl_name"
        Invoke-Sqlcmd -ServerInstance <Server-Name> -Database <DB-Name> -Query $Drop_Command
        
        $Create_Command = "Create table dbo.test1 (Id int, CONSTRAINT PK_test1_Id PRIMARY KEY (Id))"
        Invoke-Sqlcmd -ServerInstance <Server-Name> -Database <DB-Name> -Query $Create_Command
        
        
        $Insert_Command = "INSERT INTO dbo.test1(Id) Values ($Id)"
        Write-Host "$Insert_Command->" $Insert_Command
        Invoke-Sqlcmd -ServerInstance <Server-Name> -Database <DB-Name> -Query $Insert_Command
        # Start-Sleep -Seconds 10
        
        Write-Host "Record Inserted with Id->" $Id
     }
     $scope.Complete()
     # $scope.Dispose()     
   }            
 }     
 catch
 {
      Write-Host "Record not Inserted ->" $Id
      $_.exception.message
 }
 finally
 {
    $scope.Dispose() 
    $conn.Close()
 }

标签: sql-serverpowershellpowershell-5.0

解决方案


Invoke-SqlCmd是一种方便的方法。构建一个包含所有事务处理的单个脚本并将其传递给,Invoke-SqlCmd或直接使用SqlConnection,对象。SqlCommandSqlTransaction

而且我不确定TransactionScope在 PowerShell 中是否有效。


推荐阅读