PowerShell: - Невозможно индексировать нулевой массив. используя набор данных из Invoke-SqlCmd

У меня возникла проблема с приведенным ниже сценарием. Это сценарий, который я хочу использовать для мониторинга некоторых заданий для приложения. Я использую команду Invoke sqlcmd для загрузки наборов данных. Все это прекрасно работает, если запросы на выборку возвращаются с atelast 1 строкой.

Если нет результатов (что обычно и бывает), я получаю сообщение об ошибке:

>Cannot index into a null array.
At P:\DeploymentTESTING\PowerShell\EVENING_CHECK_JOBS_FL_WITH_DETAILS.ps1:40 char:7
+   IF ($JOBERRORS_INT.Tables[0].Rows.Count -eq 0 -and $LONGRUNNINGJOBS ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Это терпит неудачу, когда дело доходит до первого оператора if. Я относительно новичок в powershell, и я попытался найти эту проблему в сочетании с Invoke Sqlcmd и получить набор данных -AS, однако я не могу найти или не могу понять, как с этим справиться.

у кого-то есть идея? был бы очень признателен.

[string]$RESULT = "test" 

[STRING]$JOB_SERVER_ACC = "SERVERNAME"

[STRING]$JOB_DB_INT = "DATABASE"

[STRING]$QUERY_1 = "SELECT *
                    FROM [JOB]
                   WHERE  [JOB_STATUS] = 'ERR';"

[STRING]$QUERY_2 = "SELECT *
                    FROM [JOB]
                  WHERE JOB_STATUS = 'RUN'
                  AND DATEDIFF(MINUTE,JOB_LOG_START_DATETIME,sysdatetime()) > 120; "

[STRING]$QUERY_3 = "SELECT COUNT([JOB_NAME])
                  FROM [JOB]
                  WHERE JOB_STATUS = 'RUN';"

$JOBERRORS_INT = Invoke-Sqlcmd -ServerInstance $JOB_SERVER_ACC -Database $JOB_DB_INT -Query $QUERY_1 -AS DataSet 

$LONGRUNNINGJOBS_INT = Invoke-Sqlcmd -ServerInstance $JOB_SERVER_ACC -Database $JOB_DB_INT -Query $QUERY_2 -AS DataSet  

$RUNNINGJOBS_INT = Invoke-Sqlcmd -ServerInstance $JOB_SERVER_ACC -Database $JOB_DB_INT -Query $QUERY_3  


    IF ($JOBERRORS_INT.Tables[0].Rows.Count -eq 0 -and $LONGRUNNINGJOBS_INT.Tables[0].Rows.Count -eq 0 -and $RUNNINGJOBS_INT.ItemArray[0] -NE 0 ) 
   { 

        $RESULT = $RESULT + "OK"
              }
        Else {

         $RESULT = $RESULT + "NOT OK - PLEASE LOGON AND CHECK!"
            IF ($JOBERRORS_INT.Tables[0].Rows.Count -NE 0) {         

              $RESULT = $RESULT + " 
$($JOBERRORS_INT.TableS[0].Rows.Count)  JOBS IN ERROR!  " 
                              }

            IF ($LONGRUNNINGJOBS_INT.Tables[0].Rows.Count -ne $null) { 
            $RESULT = $RESULT + " 
$($LONGRUNNINGJOBS_INT.Tables[0].Rows.Count)  LONG RUNNING JOBS!"

                        }                                                          

            IF ($RUNNINGJOBS_INT.ItemArray[0] -EQ 0) { 
            $RESULT = $RESULT + "  
NO JOBS RUNNING AT ALL!"}
        }


WRITE-HOST -F DarkYellow $RESULT

person Rob Verheij    schedule 14.05.2020    source источник
comment
Вам необходимо проверить свои переменные запроса на $null или используйте Measure-Object, чтобы подсчитать количество результатов в массиве.   -  person Ash    schedule 14.05.2020


Ответы (1)


Я нашел это.... Что-то очевидное:

$JOBERRORS_INT.Tables[0].Rows.Count -> $JOBERRORS_INT.Count

person Rob Verheij    schedule 14.05.2020