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:
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
So geht es aber leider nicht. PowerShel hängt sich auf und irgendwann bricht mit einer Fehlermeldung ab:
Hat jemand eine Idee, wie ich das lösen kann?
Gruß
highpriest
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 610308
Url: https://administrator.de/contentid/610308
Ausgedruckt am: 19.11.2024 um 17:11 Uhr
6 Kommentare
Neuester Kommentar
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 .
Bsp.
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 .
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]
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
So geht es aber leider nicht. PowerShel hängt sich auf und irgendwann bricht mit einer Fehlermeldung ab:
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.
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
Aber wie kriege ich alles als eine Tabelle in eine Datei?
@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.
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