I use the following framework to run scripts calling sqlcmd simultaneously as PowerShell jobs during some MsBuild Task. My Buildagents are running Server 2003 and there are some linitations cf. StackOverflow.
But just calling sqlcmd works fine. In fact I'm dropping and recreating my test databases and running a lot of sql scripts completly within such background jobs. I didn't try it with the Oracle part using sqlplus which I run in the main script and after whose termination I wait for jobs to terminate in time or terminate them.
$workdir = Split-Path $MyInvocation.MyCommand.Path $logdir = 'C:\temp\log' $server1 = 'my_sql2008' $server2 = 'my_sql2005' $datbase = 'PowerShellTest' $cmd1 = [scriptblock]::Create(". $workdir\script_containing_function_for_background_job.ps1 Some_function -server $server1 -database $datbase $logdir -asJob" ) $cmd1 = [scriptblock]::Create(". $workdir\script_containing_function_for_background_job.ps1 Some_function -server $server2 -database $datbase $logdir -asJob" ) "...Starting the background jobs" $SQLJobStartTime = Get-date $jnr1 = (Start-Job -ScriptBlock $cmd1).Id $jnr2 = (Start-Job -ScriptBlock $cmd2).Id # ***************************************** ' Doing something slow here (it happens to be with an Oracle Server' <# .... #> function Get-WaitTime { param( [DateTime]$start, $dauer ) $rest = $dauer - ((Get-Date) - $start).Totalseconds if ($rest -lt 0) {$rest = 0} $rest } '...Waiting for job on SQL Server 2008' Wait-job -id $jnr1 -timeout ( Get-WaitTime $SQLJobStartTime 960 ) # max 16 min if ((Get-job -id $jnr1).state -eq 'Running') { Stop-job -id $jnr1 } Receive-Job -id $jnr1 $state1 = (Get-job -id $jnr1).State $dauer1 = ((get-date) - $SQLJobStartTime).Totalseconds "$(Get-date -f d) $(Get-date -f t) Release $release($build) Einspielen auf SQl-Server 2008 $state1 $dauer1 secs" '...Waiting for job SQL Server 2005' Wait-job -id $jnr2 -timeout ( Get-WaitTime $SQLJobStartTime 960 ) # max 16 min if ((Get-job -id $jnr2).state -eq 'Running') { Stop-job -id $jnr2 } Receive-Job -id $jnr2 $state2 = (Get-job -id $jnr2).State $dauer2 = ((get-date) - $SQLJobStartTime).Totalseconds "$(Get-date -f d) $(Get-date -f t) Release $release($build) Einspielen auf SQl-Server 2005 $state2 $dauer2 secs"