highpriest
Goto Top

ODBC CSV-Export aus mehreren Tabellen mit PowerShell

Hallo!

Ich versuche aus einer ODBC Quelle Daten als CSV zu exportieren. Mit dem folgenden Script und einer Tabelle funktioniert auch:

$sf = "C:\Test\test.csv"  

$query = @"  
SELECT TABELLE1.SPALTE1, TABELLE1.SPALTE2
FROM TABELLE1
"@   

function Get-ODBC-Data{
    $conn = New-Object System.Data.Odbc.OdbcConnection
    $conn.ConnectionString = "DSN=MyDSN;"  
    $conn.Open()
    $cmd = New-object System.Data.Odbc.OdbcCommand($query, $conn)
    $ds = New-Object system.Data.DataSet
    (New-Object System.Data.Odbc.OdbcDataAdapter($cmd)).Fill($ds) | Out-Null
    $conn.Close()
    $ds.Tables | Export-Csv $sf -NoTypeInformation -Encoding Default
}

Get-ODBC-Data

Ich muss aber aus zwei Tabellen Daten in eine CSV-Datei schreiben. Ich dachte es geht einfach mit der Erweiterung der SELECT-Anweisung:
SELECT TABELLE1.SPALTE1, TABELLE1.SPALTE2, TABELLE2.SPALTE1, TABELLE2.SPALTE2
FROM TABELLE1, TABELL2


$sf = "C:\Test\test.csv"  

$query = @"  
SELECT TABELLE1.SPALTE1, TABELLE1.SPALTE2, TABELLE2.SPALTE1, TABELLE2.SPALTE2
FROM TABELLE1, TABELL2
"@   

function Get-ODBC-Data{
    $conn = New-Object System.Data.Odbc.OdbcConnection
    $conn.ConnectionString = "DSN=MyDSN;"  
    $conn.Open()
    $cmd = New-object System.Data.Odbc.OdbcCommand($query, $conn)
    $ds = New-Object system.Data.DataSet
    (New-Object System.Data.Odbc.OdbcDataAdapter($cmd)).Fill($ds) | Out-Null
    $conn.Close()
    $ds.Tables | Export-Csv $sf -NoTypeInformation -Encoding Default
}

Get-ODBC-Data

So geht es aber leider nicht. PowerShel hängt sich auf und irgendwann bricht mit einer Fehlermeldung ab:
Export-Csv : Das Argument kann nicht an den Parameter "InputObject" gebunden werden, da es NULL ist.  
In C:\test\test.ps1:23 Zeichen:21
+ ...   $ds.Tables[1] | Export-Csv $sf -NoTypeInformation -Encoding Default
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Export-Csv], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ExportCsvCo
   mmand

Hat jemand eine Idee, wie ich das lösen kann?

Gruß
highpriest

Content-ID: 610308

Url: https://administrator.de/contentid/610308

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

146189
Lösung 146189 05.10.2020 aktualisiert um 12:11:16 Uhr
Goto Top
Naja wenn du zwei Tabellen als Ergebniss erhalten willst musst du auch zwei Tabellen im Dataset mit dem Datadapter füllen:
https://stackoverflow.com/questions/11345761/how-to-fill-dataset-with-mu ...
Die Fehlermeldung verwundert also nicht da es ja nur eine Tabelle im Dataset bei dir gibt und es ein $ds.Tables[1] mit Index 1 logischweise nicht gibt face-wink.

Bsp.
$myqueries = "SELECT Spalte1,Spalte2 FROM Tabelle1", "SELECT Spalte1,Spalte2 FROM Tabelle2"  
function Get-ODBCData ([string[]]$queries){
    $conn = New-Object System.Data.Odbc.OdbcConnection
    $conn.ConnectionString = "DSN=MyDSN;"  
    $conn.Open()
    $ds = New-Object system.Data.DataSet
    $da = New-Object System.Data.Odbc.OdbcDataAdapter
    $queries | % {$cnt=0}{
        $cmd = New-object System.Data.Odbc.OdbcCommand($_, $conn)
        $ds.Tables.Add("Table$cnt")  
        $da.SelectCommand = $cmd
        $da.Fill($ds.tables["Table$cnt"])  
        $cnt++
    }
    $conn.Close()
    $ds
}

$ergebnis = Get-ODBCData -queries $myqueries
$ergebnis.Tables
$ergebnis.Tables[1]
mbehrens
mbehrens 05.10.2020 um 12:20:45 Uhr
Goto Top
Zitat von @highpriest:

Ich muss aber aus zwei Tabellen Daten in eine CSV-Datei schreiben. Ich dachte es geht einfach mit der Erweiterung der SELECT-Anweisung:
SELECT TABELLE1.SPALTE1, TABELLE1.SPALTE2, TABELLE2.SPALTE1, TABELLE2.SPALTE2
FROM TABELLE1, TABELL2


$sf = "C:\Test\test.csv"  
> 
> $query = @"  
> SELECT TABELLE1.SPALTE1, TABELLE1.SPALTE2, TABELLE2.SPALTE1, TABELLE2.SPALTE2
> FROM TABELLE1, TABELL2
> "@   
> 
> function Get-ODBC-Data{
>     $conn = New-Object System.Data.Odbc.OdbcConnection
>     $conn.ConnectionString = "DSN=MyDSN;"  
>     $conn.Open()
>     $cmd = New-object System.Data.Odbc.OdbcCommand($query, $conn)
>     $ds = New-Object system.Data.DataSet
>     (New-Object System.Data.Odbc.OdbcDataAdapter($cmd)).Fill($ds) | Out-Null
>     $conn.Close()
>     $ds.Tables | Export-Csv $sf -NoTypeInformation -Encoding Default
> }
> 
> Get-ODBC-Data

So geht es aber leider nicht. PowerShel hängt sich auf und irgendwann bricht mit einer Fehlermeldung ab:
Export-Csv : Das Argument kann nicht an den Parameter "InputObject" gebunden werden, da es NULL ist.  
> In C:\test\test.ps1:23 Zeichen:21
> + ...   $ds.Tables[1] | Export-Csv $sf -NoTypeInformation -Encoding Default
> +                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo          : InvalidData: (:) [Export-Csv], ParameterBindingValidationException
>     + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ExportCsvCo
>    mmand

Das DataSet hat nur eine Tabelle, die Abfrage ist fehlerhaft und ein cross join liefert bestimmt nicht das gewünschte Ergebnis.
highpriest
highpriest 05.10.2020 um 13:53:34 Uhr
Goto Top
@146189

Cool! Also die Abfrage aus den beiden Tabellen funktioniert jetzt!
Ich habe auch soweit gebracht, dass ich die beide Tabellen in zwei verschiedene Dateien exportieren kann:

Ergänzung
..............................................................
    $conn.Close()
    $ds.Tables | Export-Csv -Path "C:\Test\test1.csv" -NoTypeInformation  
    $ds.Tables[1] | Export-Csv -Path "C:\Test\test2.csv" -NoTypeInformation  
}

Aber wie kriege ich alles als eine Tabelle in eine Datei?
mbehrens
Lösung mbehrens 05.10.2020 um 14:00:28 Uhr
Goto Top
Zitat von @highpriest:

@146189

Cool! Also die Abfrage aus den beiden Tabellen funktioniert jetzt!
Ich habe auch soweit gebracht, dass ich die beide Tabellen in zwei verschiedene Dateien exportieren kann:

Ergänzung
> ..............................................................
>     $conn.Close()
>     $ds.Tables | Export-Csv -Path "C:\Test\test1.csv" -NoTypeInformation  
>     $ds.Tables[1] | Export-Csv -Path "C:\Test\test2.csv" -NoTypeInformation  
> }
> 

Aber wie kriege ich alles als eine Tabelle in eine Datei?

Entweder über ein passenden SQL Statement oder so wie in der Dokumentation von Export-Csv angegeben.
highpriest
highpriest 05.10.2020 um 15:10:37 Uhr
Goto Top
Zitat von @mbehrens:

Entweder über ein passenden SQL Statement oder ......

Oh, man! Natürlich! Ich stand die ganze Zeit auf dem Schlauch!

Jetzt habe ich so, wie es sein soll!!!

Ich danke Euch beiden sehr @146189 und @mbehrens für Eure Unterstützung!!!

Gruß
highpriest
146189
146189 05.10.2020 aktualisiert um 18:14:21 Uhr
Goto Top
Aber wie kriege ich alles als eine Tabelle in eine Datei?
Wenn beide Abfragen im Select gleiche Spaltennamen haben, geht auch
$ds.Tables.Rows | Export-Csv -Path "C:\Test\test1.csv" -NoTypeInformation