#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. Ты просто продолжай давать! Спасибо, приятель, это сделало бы его намного чище. Если вы опубликуете его в качестве ответа, я могу дать его вам 🙂