在批处理文件中使用多个 SQLCMD 调用进行事务

Met*_*hor 7 sql-server transaction sqlcmd sql-server-2014

有没有什么好方法可以做以下事情?

SQLCMD -S %SERVER% -E -Q "BEGIN TRANSACTION"
FOR %%f in (script1 script2 script3) do (
    SET CURRENT_SCRIPT=%%f
    SQLCMD -S Localhost -E -b -V 1 -i %%f.sql -o %%f.log
    IF !ERRORLEVEL! NEQ 0 GOTO ERROR
    SET CURRENT_SCRIPT=
)
SQLCMD -S %SERVER% -E -Q "COMMIT TRANSACTION"
Run Code Online (Sandbox Code Playgroud)

Mik*_*Fal 10

因为每个 sqlcmd 执行都是一个单独的会话,这意味着您不能有跨越这些执行的事务。您将希望将您的脚本组合成一个脚本,以便您执行所需的操作。

如果您可以正确订购脚本,Powershell 中的以下方法将适用于您:

$scripts = Get-ChildItem "C:\temp\*.sql" |Sort-Object
$fullbatch = @()
$fullbatch += "BEGIN TRANSACTION;"

foreach($script in $scripts){
    $fullbatch += Get-Content $script
}

$fullbatch += "COMMIT TRANSACTION;"

sqlcmd -S localhost -d test -Q "$fullbatch"
Run Code Online (Sandbox Code Playgroud)

本质上,我将每个脚本(假设它们的顺序正确)读入单个批处理变量,将BEGIN TRANSACTION和附加END TRANSACTION到批处理,然后在我的 sqlcmd 执行中将其作为查询执行。