Explicit sql transaction in powershell

There are some hoops you need to jump through to get a multi-statement transaction committed via powershell. Default time-out is set to only one minute, so using the code below you can increase it.


$timeout = New-Object System.TimeSpan -ArgumentList @(5,0,0) # five hours
$options = [System.Transactions.TransactionScopeOption]::Required
$scope = New-Object -TypeName System.Transactions.TransactionScope -ArgumentList @($options,$timeout)

try
{
 #Multiple queries, loops or whatever fun here, inside transaction
 Invoke-Sqlcmd -ErrorAction 'Stop' -querytimeout 0 -ServerInstance $server -Database $database -InputFile $fileName1;
 Invoke-Sqlcmd -ErrorAction 'Stop' -querytimeout 0 -ServerInstance $server -Database $database -InputFile $fileName2;
 Invoke-Sqlcmd -ErrorAction 'Stop' -querytimeout 0 -ServerInstance $server -Database $database -InputFile $fileName3;
 
 $scope.Complete() #we tell transactionscope to commit when using ends (dispose)
 $scope.Dispose() #this is where the actual commit is sent to sql server
}
catch { 
 $scope.Dispose() #.Dispose() without .Complete() will roll back transaction
 throw ("Error while executing inside transaction, it has been rolled back: {0}" -f $_.Exception)
}

Comments

Popular posts from this blog

How to decrypt stored password from SSMS registered servers

How to fail sql server agent job if powershell script fails

Cause for Parameter is incorrect 0x80070057 error in ssis