У меня есть два запроса, выполненные на разных экземплярах SQL. Я должен выполнить их как два отдельных запроса.

Мне нужно объединить результаты из них в один, чтобы я мог создать файл CSV со всеми строками из $ result, когда в $ lookup есть совпадение. Сопоставление производится путем сравнения столбцов с именем ID в обоих.

Файл CSV должен содержать все столбцы из $ result, а также все столбцы из совпадающей строки в $ lookup, кроме 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

РЕДАКТИРОВАТЬ: Получил работу, ответьте ниже.

1
SAS 11 Апр 2019 в 11:42

2 ответа

Лучший ответ

Я переключился на использование «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
     }
 }
0
SAS 11 Апр 2019 в 11:39

Я предлагаю кое-что по этому поводу:

  • перечислить столбцы $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
1
11 Апр 2019 в 10:13