You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:51:48