繁体   English   中英

使用powershell在单个事务中调用多个文件的invoke-sqlcmd

[英]invoke-sqlcmd for multiple files in single transaction using powershell

在线发现了大量的示例如何在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有关?

我相信它已经解决了。 阅读下面的后文章大约只有使用SQLCMD执行能力,具有在出错退出,我肯定有关于PowerShell的调用,SQLCMD疑虑。

以下是我在这里发现的一些文档,我认为可能与它有关: http//technet.microsoft.com/en-us/library/cc281720.aspx

特别是以下内容:*

并非所有sqlcmd命令都在Invoke-Sqlcmd中实现。 未实现的命令包括以下内容:: !!,:connect,:error,:out,:ed,:list,:listvar,:reset,:perftrace和:serverlist。

*

最后,我仍然使用必须读取每个文件的内容然后具有以下内容的策略:

:On Error Exit

在脚本的顶部,最终写入包含其他文件中所有其他sql的输出文件。

然后,我执行以下操作来调用实际的sqlcmd:

$command = "sqlcmd.exe -S " + $databaseServer + " -d " + $databaseName + " -i " + $outFile
Invoke-Expression $command

这似乎工作得很好,一切都回滚:)如果有人能想到更好的解决方案,请告诉我!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM