合并来自不同实例的两个SQL查询的结果,而不是可链接的

问题描述 投票:1回答:2

我在不同的SQL实例上执行了两个查询。我必须将它们作为两个单独的查询执行。

我需要将这些结果合并为一个,以便在$ lookup中匹配时,我可以使用$ result中的所有行创建一个CSV文件。通过比较两者中名为ID的列来进行匹配。

CSV文件应包含$ result中的所有列,以及$ lookup中匹配行的所有列,ID除外。

除了两者中的ID之外,列名称是未知的。

要创建CSV,我计划使用Export-CSV。但我需要以某种方式结合这两个结果。

$result = @(Invoke-Sqlcmd –ServerInstance $ServerInstance –Database $Database -ErrorVariable sqlerr -OutputSqlErrors $true -Query $sql -QueryTimeout 0 -ErrorAction Stop | select *)
$lookup = @(Invoke-Sqlcmd –ServerInstance $ServerInstance –Database $Database -ErrorVariable sqlerr -OutputSqlErrors $true -Query $sql -QueryTimeout 0 -ErrorAction Stop | select *)

我试过这个例子:

($result | select *) | Join ($lookup | select *) -on ID -eq ID

编辑:搞定了,回答如下。

powershell
2个回答
1
投票

我建议这样做:

  • 枚举$result$lookup的列
  • 确定要添加的列
  • 用这些列扩展$result
  • 迭代$result的行得到匹配的$lookup
  • 插入值

未经测试的脚本:

## the following commands are incomplete (missing closing parenthesis)
# $result = @(Invoke-Sqlcmd –ServerInstance $ServerInstance –Database $Database -ErrorVariable sqlerr -OutputSqlErrors $true -Query $sql -QueryTimeout 0 -ErrorAction Stop | select *
# $lookup = @(Invoke-Sqlcmd –ServerInstance $ServerInstance –Database $Database -ErrorVariable sqlerr -OutputSqlErrors $true -Query $sql -QueryTimeout 0 -ErrorAction Stop | select *

$resultCols = $result.PsObject.Properties.Name
$AppendCols = $lookup.PsObject.Properties.Name | Where Name -notin $resultCols

$result = $result | Select-Object -Property *,$AppendCols

foreach($Row in $result){
    $lookupID = $lookup | Where-Object ID -eq $Row.ID
    if($lookupID){
        foreach($Col in $AppendCols){
            $Row.$Col = $lookupID.$Col
        }
    }
}
$result | Export-Csv -NoTypeInformation .\ExtendedResult.csv

0
投票

我在获取数据时切换到使用“System.Data.SqlClient”。然后下面的代码工作。感谢TopPings指出我正确的方向。

 $resultCols = ($result.Columns | ForEach-Object {$_.ColumnName})
 $AppendCols = ($lookup.Columns | ForEach-Object {$_.ColumnName})
 $AppendCols = $AppendCols | Where-Object {$_ -ne 'ID'}

 $AllCols = $resultCols + $AppendCols

 $result = $result | Select-Object -Property $AllCols
 $output = @()

 foreach($Row in $result)
 {
     $lookupIDRow = $lookup | Where-Object ID -eq $Row.ID
     if($lookupIDRow)
     {
         foreach($Col in $AppendCols)
         {
             $Row.$Col = $lookupIDRow.$Col
         }

         $output+=$Row
     }
 }
© www.soinside.com 2019 - 2024. All rights reserved.