Vik*_*s J 6 sql-server powershell powershell-5.0
我正在使用 PowerShell 版本 5,并且正在 PowerShell 脚本中执行几个 SQL 命令。与 SQL Server 不同的是,我们在BEGIN TRANSACTION和COMMIT TRANSACTION中执行命令,这样如果单个命令失败,所有内容都会回滚,我想在我的 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()
}
Run Code Online (Sandbox Code Playgroud)
Invoke-SqlCmd是一种方便的方法。要么构建一个包含所有事务处理的单个脚本并将其传递给Invoke-SqlCmd, , 对象,要么直接使用SqlConnection, SqlCommand,SqlTransaction对象。
我不确定TransactionScope在 PowerShell 中是否有效。