@alexeyborisov75

PowerShell отсеивание пустых результатов?

Добрый день!
подскажите пожалуйста как мне выбрать "$result.Tables" которые содержат больше одной записи, так-как одна запись является заголовками результатов запросов из файла SQLQuery1.sql, но по факту результата запроса не имеют.

$Connection = "Server=localhost\SQLEXPRESS;Database=msdb;Trusted_Connection=True;"
  $InputFile  = "C:\Users\TestScripts\SQLQuery1.sql"
  $ExportFile = "C:\Users\TestScripts\Report.xls"
  $Sheatnamber = 0 
  
  $result = Invoke-Sqlcmd -InputFile $InputFile  -OutputAs Dataset -ConnectionString $Connection 

  $t =  $result.Tables.Count

  $t 

  for ($i = 0; $i -lt $t; $i++)
{ 
   
   $Sheatnamber = $Sheatnamber + 1
   $sheatname = "Запрос " + $Sheatnamber

   $result.Tables.DataRow.Item($i)  | Select-Object -Property * -ExcludeProperty RowError,RowState,Table,ItemArray,HasErrors  |Export-Excel -WorksheetName $sheatname -Path  $ExportFile -AutoSize

}
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
так вот, ваш запрос возвращает несколько таблиц
$result.Tables.Count - это количество таблиц.
Их можно перечислять как
$result.Tables[0], $result.Tables[1] и тд
В каждой из таблиц есть строки
$result.Tables[0].DataRow,. $result.Tables[1].DataRow
Каждый Datarow - это отдельный объект, у него тоже есть свой Count - $result.Tables[0].DataRow.Count

Вы в своём коде берете все строки из всех таблиц сразу и пишете в эксель. Кстати, внутри цикла перебирающего строки, это делать не рекомендуется.
Вам надо пробегать не по строкам, а по таблицам и проверять, если есть данные - писать (и безо всяких for, это прошлый век :) )
То есть что-то вроде:
foreach ($table in $result.Tables) {
  if ($table.DataRow.Count) {
    $table.DataRow | ... | Export-Excel ...
  }
}


Могу наврать с точными названиями свойств, может там просто Rows, сейчас не вспомню, но на один из ваших прошлый вопросов я давал ссылки.
Проще всего выполнять построчно и смотреть что внутри каждого из объектов
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы