【发布时间】:2021-12-13 19:06:14
【问题描述】:
我们如何确保在 1 个数据库事务中执行以下函数?
#
# Get SQL Files recursively
#
function GetFiles($path = $pwd)
{
$subFolders = Get-ChildItem -Path $path -Directory | Select-Object FullName,Name | Sort-Object -Property Name
$sqlFiles = Get-ChildItem -Path $path -Filter *.sql | Select-Object FullName,Name | Sort-Object -Property Name
foreach ($file in $sqlFiles)
{
Write-Host "file: " $file.Name
Invoke-Sqlcmd -ServerInstance $ServerInstance -Database $DBName -Username $SvcAdminAccount -Password $SvcAdminPassword -InputFile $file.FullName -QueryTimeout 65535 -ea stop
}
foreach ($folder in $subFolders)
{
Write-Host "`nGetting files for subfolder: " $folder.Name
GetFiles $folder.FullName
}
}
这个函数遍历一个目录并且会为每个文件调用-sqlcmd。 我们如何保证整个函数在一个sql事务中执行>?
【问题讨论】:
-
您需要创建一个大批次以通过
invoke-sqlcmd传递。您可能最好使用ForEach创建 SQL 文件,并且必须确保在批处理开始时启用XACT_ABORT并声明事务,这样如果任何语句失败,一切都会回滚. -
每个
Invoke-Sqlcmd都是与数据库的单独会话。事务不能跨越会话。正如@Larnu 建议的那样,如果您在 SQL Server 上,请创建一个带有适当放置的BEGIN TRANSACTION;和END TRANSACTION;语句的 .sql 脚本。 -
或者你可以使用
SqlCommand和SqlConnection,在那里你可以使用BeginTransaction
标签: .net sql-server powershell