Параллельное выполнение T-SQL в PowerShell - PullRequest
0 голосов
/ 25 августа 2018

Может кто-нибудь помочь с этой проблемой? Я имею в виду пример из Интернета для параллельного выполнения операторов T-SQL.

https://www.mssqltips.com/sqlservertip/3539/complete-common-sql-server-database-administration-tasks-in-parallel-with-powershell-v3-workflow/

Я хочу иметь возможность выполнять один и тот же T-SQL на одном и том же экземпляре одновременно, чтобы подтвердить концептуальную работу по блокировке. Для этого я настроил скрипт так, чтобы я мог выполнить любое количество итераций, изменив

while ($counter -le 5)

Вот полный сценарий. В основном, основным оператором может быть любой T-SQL, который вы хотите, и он заполнит $sqlcmds, чтобы этот оператор прошел столько итераций, сколько вы пожелаете.

Import-Module sqlps -DisableNameChecking;
Set-Location c:
# create a workflow to run multiple sql in parallel
workflow Run-PSQL #PSQL means Parallel SQL {
    Param(
        [Parameter(Mandatory=$true)]
        [string]$ServerInstance,

        [Parameter(Mandatory=$false)]
        [string]$Database,

        [Parameter(Mandatory=$true)]
        [string[]]$Query # a string array to hold t-sqls
    )

    foreach -parallel ($q in $query)  {
        Invoke-Sqlcmd -ServerInstance $ServerInstance -Database $Database -Query $q -QueryTimeout 60000;
    }
} # Run-PSQL

# prepare a bunch of sql commands in a string arrary

#####new bit to make it dynamic sql multiple times
[string[]]$sqlcmds
$sqlcmds = ""
$counter = 0
do {
    "Starting Loop $Counter"

    $PrimaryStatement = '"SELECT TOP 1 * FROM sys.objects"'
    if ($counter -eq 5) {
        $sqlcmds = $sqlcmds + "$PrimaryStatement"
        Write-Host "this is what sqlcmds is $sqlcmds loop 5"
    } else {
        $sqlcmds = $sqlcmds + "$PrimaryStatement,``"
        Write-Host "this is what sqlcmds is now $sqlcmds"
    }

    $counter++
} while ($counter -le 5)

# now we can run the workflow and measure its execution duration
$dt_start = Get-Date; #start time
Run-PSQL -Server &&&&&&& -Database master -Query $sqlcmds;
$dt_end = Get-Date; #end time
$dt_end - $dt_start; # find execution duration

Когда это выполняется, я получаю это сообщение:

Run-PSQL: невозможно связать аргумент с параметром 'Query', поскольку это пустая строка.

1 Ответ

0 голосов
/ 26 апреля 2019

Есть несколько незначительных исправлений, которые я должен был внести, и ниже приведен окончательный код, который, кажется, работает должным образом

  • Перенес первый {после того, как он прокомментирован!
  • Удалено$ sqlcmds = ""
  • Изменено, как SQL агрегируется в массиве $ sqlcmds
  • Удалено if / else внутри, так как оно, кажется, не служит цели
  • Измененонапечатанный текст

    Import-Module sqlps -DisableNameChecking;
    Set-Location c:
    # create a workflow to run multiple sql in parallel
    workflow Run-PSQL #PSQL means Parallel SQL 
    {
        Param(
            [Parameter(Mandatory=$true)]
            [string]$ServerInstance,

            [Parameter(Mandatory=$false)]
            [string]$Database,

            [Parameter(Mandatory=$true)]
            [string[]]$Query #a string array to hold t-sqls
        )

        foreach -parallel ($q in $query)  {
            Invoke-Sqlcmd -ServerInstance $ServerInstance -Database $Database -Query $q -QueryTimeout 60000;
        }
    } # Run-PSQL

    # prepare a bunch of sql commands in a string arrary

    ##### new bit to make it dynamic sql multiple times
    [string[]]$sqlcmds = @()

    $counter = 0
    do {
        "Starting Loop $Counter"

        $PrimaryStatement = 'SELECT TOP 1 * FROM sys.objects'

        $sqlcmds += "$PrimaryStatement"
        Write-Host ("this is what sqlcmds has [$($sqlcmds.Count)] statements at loop counter [$Counter]")

        $counter++
    } while ($counter -le 5)

    # now we can run the workflow and measure its execution duration
    $dt_start = Get-Date; #start time
    Run-PSQL -Server 'prod-sqlcms' -Database master -Query $sqlcmds;
    $dt_end = Get-Date; #end time
    $dt_end - $dt_start; # find execution duration
...