web-dev-qa-db-fra.com

Transaction avec plusieurs appels SQLCMD dans un fichier de lot

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"
7
Metaphor

É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.

10
Mike Fal