如何使用PowerShell将两个SQL查询结果合并到同一Excel文件?
问题修正方案
原代码核心问题
- SQL调用语法错误:
Invoke-Sqlcmd的-Query参数未正确绑定查询变量,导致SQL查询未执行,结果变量为空。 - 结果关联逻辑错误:直接将多行查询结果的数组赋值给自定义对象属性,输出到Excel时会显示数组内容而非单条数据。
- 重复写入冗余:循环内每次执行
Export-Excel -Append会重复写入所有历史结果,造成数据冗余且效率低下。
修正后的代码
$server = "ServerName" $database = "DBName" $combinedResults = @() $excelFilePath = "C:\Desktop\Scripts\CSVOutput\Output_EngBOMUsed_1.xlsx" $queryBOM = "Select Distinct UsedOnRn From [NIMS_Eng].[dbo].[vEngBOMHierarchy2_Aras] EBOMH" $invokeSqlBOM = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $queryBOM foreach($row in $invokeSqlBOM){ $usedOnRn = $row.UsedOnRn # 获取源部件单行信息 $usedOnRnQuery = @" SELECT DISTINCT PartRn, PartNo AS SOURCE_PART_NUMBER, Revision AS SOURCE_PART_REVISION FROM [NIMS_Eng].[dbo].[vEngParts_Aras] WHERE PartRn = '$usedOnRn' "@ $invokeSqlusedOnRn = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $usedOnRnQuery # 获取关联部件多行信息 $partRnQuery = @" SELECT DISTINCT EBOMH.PartRn AS Child_PartRn, EPA.Revision AS RELATED_PART_REVISION, EPA.PART_NUMBER AS RELATED_PART_NUMBER, EBOMH.QtyPerAssy AS QUANTITY, EBOMH.UsedonRn FROM [NIMS_Eng].[dbo].[vEngBOMHierarchy2_Aras] EBOMH INNER JOIN [NIMS_Eng].[dbo].[vEngParts_TwoPartONly_Aras] EPA ON EPA.PartRn=EBOMH.PartRn WHERE EBOMH.UsedOnRn = '$usedOnRn' "@ $invokePartRn = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $partRnQuery # 逐行关联源部件与关联部件信息 foreach($partRow in $invokePartRn){ $combinedObject = [PSCustomObject]@{ UsedOnRn = $usedOnRn Source_Part_Number = $invokeSqlusedOnRn.SOURCE_PART_NUMBER Source_Part_Revision = $invokeSqlusedOnRn.SOURCE_PART_REVISION Related_Part_Number = $partRow.RELATED_PART_NUMBER Related_Part_Revision = $partRow.RELATED_PART_REVISION Quantity = $partRow.QUANTITY } $combinedResults += $combinedObject } } # 一次性写入所有结果到Excel $combinedResults | Export-Excel -Path $excelFilePath -AutoSize -FreezeTopRow
修改关键点说明
- 修复SQL调用:确保
Invoke-Sqlcmd的-Query参数直接绑定查询变量,保证查询正常执行。 - 优化结果关联:循环遍历多行查询的每条结果,与单行源部件信息组合成独立对象,确保每条数据格式符合预期。
- 批量写入Excel:将
Export-Excel移至循环外,一次性写入所有结果,避免重复冗余,同时添加-AutoSize和-FreezeTopRow优化输出格式。
内容的提问来源于stack exchange,提问作者Brute
相关产品推荐
相关产品推荐

