1

我想执行一组未包含的存储过程作为作业,以查看在将数据库设置为包含数据库后代码中是否存在任何问题。一段时间后,我想看看存储过程是否成功。但是,我看到创建了两个工作,而不是一个存储过程的工作。如何避免创造两个工作岗位?

$unContainedSProcs = Import-Csv -Path C:\DFLog\UnContained_Parameterless_SPs.csv
$batchSize = 50
$currentCompletedIdx = 0
$jobIds = @()
$scriptToExecute = {
    Param($storedProcToExecute)
    Invoke-Sqlcmd -Query "Exec $storedProcToExecute" -ServerInstance "<<ServerInstance>>" -Database "<<Database>>" -QueryTimeout 120
}

while ($currentCompletedIdx -le $unContainedSProcs.Length) {
    for ($i= 0; $i -le $batchSize; $i++) {
        $job = Start-Job -Name $unContainedSProcs[$i].UnContainedSProcName -ScriptBlock $scriptToExecute -ArgumentList $unContainedSProcs[$i].UnContainedSProcName
        $jobIds += $job.Id
        ++$currentCompletedIdx
    }
}

当我看到工作列表时,使用Get-Job,我看到两个工作:

+----+--------------+------+---------- -+---------------+--------------+------ -------------+
| 身份证 | 姓名 | PSJobTypeName | 状态 | 有更多数据 | 位置 | 命令 |
+----+--------------+------+---------- -+---------------+--------------+------ -------------+
| 1 | dbo.SPName | 背景工作 | 已完成 | 真 | 本地主机 | 参数($storedProcToExe... |
| 41 | 工作41 | 背景工作 | 已完成 | 真 | 本地主机 | 参数($storedProcToExe... |
+----+--------------+------+---------- -+---------------+--------------+------ -------------+
4

1 回答 1

0

我已经想通了。这是由于对for loop条件的错误定义。当存储过程数为1且for循环运行两次时:0、1。这是由于-le(小于或等于)$unContainedSProcs(1)的长度。

$unContainedSProcs 中只有一个条目 [0]。对于第一次运行,它很好。对于第二次运行,$unContainedSProcs 中没有条目 [1]。因此,正在创建空作业。将 -le 更改为 -lt 后,只创建了一个作业。

从:

for ($i= 0; $i -le $batchSize; $i++) {

至:

for ($i= 0; $i -lt $batchSize; $i++) {
于 2019-06-13T12:39:19.950 回答