在网上找到大量示例如何在 powershell 中执行以下操作:
Get-ChildItem $databaseFolder -Filter *.sql -Recurse | ForEach-Object { sqlcmd -S $databaseServer -d $databaseName -E -i $_.FullName }
但是,我想把它归为一个事务,所以如果其中一个 sql 文件失败,那么一切都会回滚。
我也在尝试的一种替代方法是将所有文件内容放在一个完整的脚本变量中:
foreach( $file in Get-ChildItem -path $databaseFolder -Filter *.sql | sort-object )
{
Get-Content $file.fullName | Foreach-Object { $fullSqlScript = $fullSqlScript + $_ + "`n" } ;
}
然后最后像这样执行:
invoke-sqlcmd -ServerInstance $databaseServer -Database $databaseName -Query $fullSqlScript | format-table | out-file -filePath $outFile
$fullSqlScript 还会在顶部插入以下内容:
:On Error Exit
SET XACT_ABORT ON
GO
Begin Transaction
并结束:
IF XACT_STATE() = 1
BEGIN
PRINT 'Committing Transaction...'
COMMIT TRANSACTION
END
ELSE IF XACT_STATE() = -1
BEGIN
PRINT 'Scripts Failed... Rolling back'
ROLLBACK TRAN
END
但是,一旦我故意使 sql 脚本失败,整个数据库就会被锁定,就像事务无法回滚一样。我假设这与在 powershell 脚本环境中使用的 invoke-sqlcmd 而不是 Windows 命令提示符中的 sqlcmd 有关?