小编典典

将Powershell SQL Server输出格式化为列和行

sql

我是Powershell的初学者,它尝试查询SQL Server数据库并以组织行和列的文件形式输出csv。我可以使用以下命令部分实现此目的:

sqlps -Command Invoke-Sqlcmd -ServerInstance "xxx.xx.xxx.xxx" 
      -Database "xxxx" -InputFile "xxx" | out-file -filepath "xxxx"

我的问题是查询的输出不会出现在行和列中,而是将每一行作为字符串列表分组在一起,每个单元格一个字符串。例如:

column a: value 1  
column b: value 1  
column c: value 1

column a: value 2  
column b: value 2  
column c: value 2

我也尝试过使用export-csv,但是这只是返回上述命令返回的每个字符串的长度,就像这个问题一样:导出csv仅吐出长度

我尝试了group-object,但是我正在努力使其正常运行。如果有人可以从概念上解释我正在尝试使用一些明确的准则做什么,将不胜感激。


阅读 252

收藏
2021-04-14

共1个答案

小编典典

Export-Csv期望输入是对象。字符串输入被视为只有一个属性(Length)的字符串对象,因此仅导出此属性。如果您的输入是字符串数组,则需要使其成为一个对象,例如:

$array = "foo", "bar", "baz"

New-Object -Type PSCustomObject -Property @{
  "a" = $array[0]
  "b" = $array[1]
  "c" = $array[2]
} | Export-Csv output.csv -NoTypeInformation

上面的代码将创建一个output.csv包含以下内容的文件:

"c","a","b"
"baz","foo","bar"

属性名(abc)都成为CSV头,属性值(foobarbaz)成为CSV值。

如果您的SQL查询生成数组列表,则可能必须执行以下操作:

Invoke-Sqlcmd ... | % {
  New-Object -Type PSCustomObject -Property @{
    "col1" = $_[0]
    "col2" = $_[1]
    "col3" = $_[2]
  }
} | Export-Csv output.csv -NoTypeInformation

不过,我手头没有SQL Server,因此请耐心等待。

2021-04-14