如何使用PowerShell将SQL Server数据添加到哈希表并正确导出CSV?
问题原因
你的代码有3个核心错误,直接导致CSV导出内容异常:
- 初始化
$hashObject时提前塞入了一个空的[PSCustomObject],导出时第一行必然是没有任何有效字段的空行 - 循环内追加数据的写法完全错误:你直接把
"Department",$department...这种平铺的键值列表追加到数组,没有构造结构化的属性对象,PowerShell会把这些零散值当成独立的数组元素,导出CSV时根本无法对应到列,自然全是无效数据 - 存在冗余逻辑:先查所有主键再循环查单条数据性能极差,且
ConvertTo-Csv管道接Export-Csv属于多此一举,Export-Csv本身就可以直接接收对象输入,不需要提前转成CSV字符串。
修正方案
最简实现(推荐,和数据库展示完全一致)
你不需要绕路用hashtable存数据,Invoke-Sqlcmd返回的结果本身就是结构化对象,直接一次查询所有需要的字段导出即可,导出效果和数据库查询结果完全一致:
$server = "DESKTOP\SQLEXPRESS" $database = "AdventureWorks2019" $outputPath = "C:\Users\Desktop\PowerShell\HashTable_OutputFiles\HashOutput.csv" # 一次查询所有需要的字段,避免循环查询的性能损耗 $query = "SELECT DepartmentID, Name, GroupName, ModifiedDate FROM [AdventureWorks2019].[HumanResources].[Department]" $queryResult = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $query # 导出时指定UTF8编码避免中文乱码,加NoTypeInformation去掉多余的类型描述头 $queryResult | Export-Csv -Path $outputPath -Encoding UTF8 -NoTypeInformation
保留原有循环逻辑的实现
如果你后续需要对单条主键对应的数据做额外处理,必须保留循环逻辑,要注意每次循环单独构造结构化对象,再追加到结果数组:
$server = "DESKTOP\SQLEXPRESS" $database = "AdventureWorks2019" $outputPath = "C:\Users\Desktop\PowerShell\HashTable_OutputFiles\HashOutput.csv" # 初始化空结果数组,不要提前塞入空对象 $resultList = @() $idQuery = "SELECT DepartmentID FROM [AdventureWorks2019].[HumanResources].[Department]" $departmentIds = (Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $idQuery).DepartmentID foreach($deptId in $departmentIds){ $detailQuery = "SELECT Name, GroupName, ModifiedDate FROM [AdventureWorks2019].[HumanResources].[Department] WHERE DepartmentID = $deptId" $deptDetail = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $detailQuery # 构造结构化对象,字段名对应CSV列名 $row = [PSCustomObject]@{ DepartmentID = $deptId Name = $deptDetail.Name GroupName = $deptDetail.GroupName ModifiedDate = $deptDetail.ModifiedDate } $resultList += $row } $resultList | Export-Csv -Path $outputPath -Encoding UTF8 -NoTypeInformation
注意事项
- 导出CSV必须加
-NoTypeInformation参数,否则文件第一行会自动写入PowerShell对象类型描述行,Excel打开会出现多余无效内容 - 必须指定
-Encoding UTF8,否则PowerShell默认用系统ANSI编码导出CSV,Excel打开中文、特殊字符会乱码,无法和数据库展示效果一致 - 不建议用字符串拼接的方式写SQL查询条件,如果查询参数来自外部输入,会存在SQL注入风险,生产环境请使用
SqlParameter传参。
内容的提问来源于stack exchange,提问作者Brute
相关产品推荐
相关产品推荐

