使用Invoke-Sqlcmd导出SQL结果,如何保存为制表符分隔的行列格式?
解决PowerShell执行SQL查询后输出为标准制表符分隔行格式的问题
我懂你遇到的困扰——Invoke-Sqlcmd默认输出的对象通过Out-File保存时,会变成分段块的样式,完全不是我们想要的规整行格式对吧?别担心,有几个简单可靠的方法能帮你把输出转成制表符分隔的标准行:
方法一:直接用Export-Csv指定制表符分隔(最推荐)
这是最省心的方式,Export-Csv本身支持自定义分隔符,我们只需要把分隔符设为制表符(用`t表示),再加上-NoTypeInformation去掉文件开头的冗余类型信息即可:
Invoke-Sqlcmd -ServerInstance "localhost" -Database "mydb" -InputFile "C:\Delivery.sql" | Export-Csv -Path "C:\Delivery.txt" -Delimiter "`t" -NoTypeInformation
生成的文件会自动按表头+每行制表符分隔数据的格式保存,规整又好用。
方法二:手动拼接制表符分隔字符串(更灵活)
如果需要更精细的控制(比如指定编码、自定义输出字段),可以先获取查询结果,再手动拼接表头和每行内容:
# 先执行查询获取完整结果集 $queryResults = Invoke-Sqlcmd -ServerInstance "localhost" -Database "mydb" -InputFile "C:\Delivery.sql" # 提取表头并转成制表符分隔的字符串 $columnHeaders = $queryResults[0].PSObject.Properties.Name -join "`t" # 写入表头到文件(指定UTF8编码避免乱码) $columnHeaders | Out-File -FilePath "C:\Delivery.txt" -Encoding utf8 # 遍历结果集,把每行的属性值拼接成制表符分隔字符串,追加到文件 $queryResults | ForEach-Object { $_.PSObject.Properties.Value -join "`t" } | Out-File -FilePath "C:\Delivery.txt" -Encoding utf8 -Append
这个方法适合需要对输出做额外处理的场景,比如过滤字段、修改内容后再保存。
方法三:用ConvertTo-Csv替换分隔符(备选)
还有一种思路是先转成CSV格式,再把逗号替换成制表符,但要注意:如果你的字段内容本身包含逗号,这个方法可能会破坏数据结构,仅适合数据无逗号的场景:
Invoke-Sqlcmd -ServerInstance "localhost" -Database "mydb" -InputFile "C:\Delivery.sql" | ConvertTo-Csv -NoTypeInformation | ForEach-Object { $_ -replace ',', "`t" } | Out-File -FilePath "C:\Delivery.txt" -Encoding utf8
内容的提问来源于stack exchange,提问作者David Garcia




