Y a-t-il un bon moyen de faire quelque chose comme ce qui suit?
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"
Étant donné que chaque exécution SQLCMD est une session distincte, cela signifie que vous ne pouvez pas avoir de transactions couvrant ces exécutions. Vous allez vouloir combiner vos scripts en un seul script pour que vous puissiez faire ce que vous voulez.
Si vous pouvez commander correctement vos scripts, l'approche suivante à PowerShell fonctionnera pour vous:
$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"
Essentiellement, j'ai lu dans chaque script (en supposant qu'ils sont commandés correctement) dans une seule variable par lots, appendez A BEGIN TRANSACTION
et END TRANSACTION
Pour le lot, puis exécutez-le comme une requête dans mon exécution SQLCMD.