sql-server - PowerShell - 如果所有 Invoke-SQL 命令都成功,如何提交范围
问题描述
我正在使用 PowerShell 版本 5,并且正在 PowerShell 脚本中执行几个 SQL 命令。与我们在BEGIN TRANSACTION和COMMIT 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()
}
解决方案
Invoke-SqlCmd
是一种方便的方法。构建一个包含所有事务处理的单个脚本并将其传递给,Invoke-SqlCmd
或直接使用SqlConnection
,对象。SqlCommand
SqlTransaction
而且我不确定TransactionScope
在 PowerShell 中是否有效。
推荐阅读
- reactjs - 反应错误独特的“关键”道具。虽然 key 是唯一的
- python-3.x - 嗨,我正在尝试编写代码,从保存为文本文件的发票中提取信息
- node.js - 启动使用 Firebase Functions 部署的 Alexa 技能时出现问题
- python - Celery 和 Flask - 不能将新设置名称与旧设置名称混合使用
- python-3.x - 我正在尝试制作语音助手来控制我的房间,但响应时间很慢
- python - 如何在 ElasticSearch 中正确使用“术语”过滤器?
- r - 替换矩阵中的未知行数
- angular - 时间屏蔽输入字段 Angular 9
- c# - 子列表(链表)上的枚举器
- r - 将计算的平均值添加到 R 图中的垂直线