Powershell, вызов-sqlcmd, экспорт-csv не показывает данные, если имеется более одного результата

#sql #powershell #csv #invoke-sqlcmd #export-csv

Вопрос:

У меня есть приведенный ниже код для получения данных из базы данных SQL и экспорта их в файл CSV:

 #Server and Database names
$SQLServer = "Servername"
$DB = "DatabaseName"

#SQL Command
$FullScriptSQL="Select * from MyTable WHERE Column = 'TestData'"

#Invoke the command, rename the column headers and export to CSV file
$FullScriptCallLinked = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $DB -Query $FullScriptSQL | select-object @{ expression={$_.Column1};label='Column1 Name'},@{ expression={$_.Column2};label='Column2 Name'},@{ expression={$_.Column3}; label='Column3 Name' },@{ expression={$_.Column4} ; label='Column4 Name' }
Export-CSV -Path ".ResultFileFullScript.csv" -inputobject $FullScriptCallLinked -Append -NoTypeInformation
 

Это прекрасно работает, если есть один результат. Но если есть более одного результата, он будет показан ниже в файле csv

введите описание изображения здесь

Я не понимаю, почему он это делает. Очевидно, это данные параметров БД или что-то в этом роде. Несколько дней гуглил в Интернете, но безуспешно. Кто-нибудь умнее меня может помочь, пожалуйста?

Ответ №1:

Вместо использования Select-Object для переименования столбцов, что довольно неэффективно, вы можете указать псевдоним для столбцов в самом запросе:

 $SQLServer = "Servername"
$DB = "DatabaseName"

$query = @'
SELECT Column1 AS "Column1 Name",
       Column2 AS "Column2 Name",
       Column3 AS "Column3 Name",
       Column4 AS "Column4 Name"
FROM MyTable
WHERE ColumnX = 'TestData'
'@

Invoke-Sqlcmd -ServerInstance $SQLServer -Database $DB -Query $query |
Export-CSV -Path ".ResultFileFullScript.csv" -NoTypeInformation
 

Кроме того, как и в моем комментарии, код, который у вас есть по вашему вопросу, в порядке и должен работать, единственная проблема заключалась в использовании -InputObject вместо передачи результатов в Export-Csv :

 $FullScriptCallLinked | Export-Csv -Path ".ResultFileFullScript.csv" -NoTypeInformation
 

Ответ №2:

Понял это. Я знал, что был близок!

 #Server and Database names
$SQLServer = "Servername"
$DB = "DatabaseName"

#SQL Command
$FullScriptSQL="Select * from MyTable WHERE Column = 'TestData'"

#Invoke the command, rename the column headers and export to CSV file
$FullScriptCallLinked = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $DB -Query $FullScriptSQL 

foreach($i in $FullScriptCallLinked){
  select-object @{ expression={$_.Column1};label='Column1 Name'},@{ expression={$_.Column2};label='Column2 Name'},@{ expression={$_.Column3}; label='Column3 Name' },@{ expression={$_.Column4} ; label='Column4 Name' }
  Export-CSV -Path ".ResultFileFullScript.csv" -inputobject $i -Append -NoTypeInformation
}
 

Комментарии:

1. На самом деле сценарий из вашего вопроса сработал бы, если бы вы передали объект в Export-Csv : $FullScriptCallLinked | Export-Csv -Path ".ResultFileFullScript.csv" -NoTypeInformation вместо использования -InputObject .

2. Ай-яй-яй! Идеальный. На самом деле я пришел сюда, чтобы исправить другую ошибку, которую я сделал выше, но ваша намного лучше. Миллион раз спасибо!

3. Полезно знать, почему бы не использовать SELECT Column1 AS "Column1 Name", Column2 AS "Column2 Name"..... в своем SQL-запросе, если бы вам даже не нужно было переименовывать свои столбцы с Select-Object помощью 🙂

4. Я опубликую это в качестве ответа, надеюсь, в этом будет больше смысла.

5. Ты просто продолжай давать! Спасибо, приятель, это сделало бы его намного чище. Если вы опубликуете его в качестве ответа, я могу дать его вам 🙂