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-Key: 610308

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

Printed on: April 26, 2024 at 05:04 o'clock

Mitglied: 146189
Solution 146189 Oct 05, 2020 updated at 10:11:16 (UTC)
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]
Member: mbehrens
mbehrens Oct 05, 2020 at 10:20:45 (UTC)
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.
Member: highpriest
highpriest Oct 05, 2020 at 11:53:34 (UTC)
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?
Member: mbehrens
Solution mbehrens Oct 05, 2020 at 12:00:28 (UTC)
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.
Member: highpriest
highpriest Oct 05, 2020 at 13:10:37 (UTC)
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
Mitglied: 146189
146189 Oct 05, 2020 updated at 16:14:21 (UTC)
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