Invoke-sqlcmd und Zellen mit null-Wert
Hallo!
Ich verzweifle seit 2 Tagen an invoke-sqlcmd, habe gefühlt schon das gesamte internet leer gelesen und kann mir nicht vorstellen, dass ich der erste mit diesem Problem bin und das noch niemand gelöst hat:
invoke sqlcmd liefert keine Null-Werte, d.h. wenn das Feld in der Datenbank null enthielt, habe ich jetzt eine leere Zelle in der Ergebnis-Tabelle (genau gesagt in der row-collection). Ich muss aber in der letztlich zu erstellenden Date null haben, weil die Datei in ein System hochgeladen werden soll, das leere Zellen nicht akzeptiert.
Mein bisheriger Code:
Ich versuche also, die einzelnen Zeilen (und darin die einzelnen Spalten) durchzugehen, die leeren Zellen zu erkennen und ggf 'null' zu setzen. Beim Debuggen des Codes sehe ich auch, dass die Erkennung funktioniert. Aber
1. erscheint in der entstehenden Datei keine null
2. ist die entstehende Datei total falsch. Statt 40 Spalten mit 16000 Zeilen gibt es eine Spalte mit 700000 Zeilen (alles ca.). Ohne den Versuch, durch die Zeilen und Spalten zu gehen, entsteht eine Datei im korrekten Format.
Ich würde mich freuen, wenn mir jemand
a) sagen würde, wo mein Code falsch ist oder
b) einen ganz anderen Ansatz liefern könnte.
Herzlichen Dank schonmal im Voraus,
Olaf
Ich verzweifle seit 2 Tagen an invoke-sqlcmd, habe gefühlt schon das gesamte internet leer gelesen und kann mir nicht vorstellen, dass ich der erste mit diesem Problem bin und das noch niemand gelöst hat:
invoke sqlcmd liefert keine Null-Werte, d.h. wenn das Feld in der Datenbank null enthielt, habe ich jetzt eine leere Zelle in der Ergebnis-Tabelle (genau gesagt in der row-collection). Ich muss aber in der letztlich zu erstellenden Date null haben, weil die Datei in ein System hochgeladen werden soll, das leere Zellen nicht akzeptiert.
Mein bisheriger Code:
$dbResult = Invoke-Sqlcmd -Query $Sql -ConnectionString $global:ConStr -OutputAs DataTables
$dbResult | forEach-Object {
foreach ($dbColumn in $dbResult.Columns) {
if ($_.Item($dbColumn).ToString().Length -eq 0) {
'null'
} else { $_.Item($dbColumn) }
}
} | Export-CSV -path $sTempFile -NoTypeInformation -Encoding $oWork.Encoding -UseCulture -UseQuotes Never
Ich versuche also, die einzelnen Zeilen (und darin die einzelnen Spalten) durchzugehen, die leeren Zellen zu erkennen und ggf 'null' zu setzen. Beim Debuggen des Codes sehe ich auch, dass die Erkennung funktioniert. Aber
1. erscheint in der entstehenden Datei keine null
2. ist die entstehende Datei total falsch. Statt 40 Spalten mit 16000 Zeilen gibt es eine Spalte mit 700000 Zeilen (alles ca.). Ohne den Versuch, durch die Zeilen und Spalten zu gehen, entsteht eine Datei im korrekten Format.
Ich würde mich freuen, wenn mir jemand
a) sagen würde, wo mein Code falsch ist oder
b) einen ganz anderen Ansatz liefern könnte.
Herzlichen Dank schonmal im Voraus,
Olaf
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 63708510548
Url: https://administrator.de/contentid/63708510548
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
10 Kommentare
Neuester Kommentar
Teste mal (habe gerade kein Zugriff auf Invoke-SQLCmd
https://tio.run/##fZAxb8IwEIX3/AoPkexIJgsbElJQKzY6tBVLlMGJD5HWsZHtNEWI35 ...
Gruß
$dbResult = Invoke-Sqlcmd -Query $Sql -ConnectionString $global:ConStr -OutputAs DataTables
$result = foreach($entry in $dbResult.Rows){
$new = [ordered]@{}
foreach($dbColumn in $dbResult.Columns){
$new.$dbcolumn = $entry[$dbColumn]
if ($entry[$dbColumn] -in @([system.dbnull]::Value,$null,'')){
$new.$dbcolumn = 'null'
}
}
[pscustomobject]$new
}
If($result){
$result | Export-CSV -path $sTempFile -NoTypeInformation -Encoding $oWork.Encoding -UseCulture -UseQuotes Never
}
Gruß
Moin.
Nee lass das mit dem Replace das ist Humbug. Habe es oben entsprechend angepasst, sollte jetzt kein Problem mehr darstellen.
Nee lass das mit dem Replace das ist Humbug. Habe es oben entsprechend angepasst, sollte jetzt kein Problem mehr darstellen.
schöne Grüße an Frau Hansen!
Likörchen geht immer, näch 😂.
Moin,
Numerische und nicht numerische Felder fängst du im Query mit folgendem ab:
Dann erhältst du kein NULL (was bei einem CSV-Export sogar Mist wäre) sondern eine 0 bzw. ein Feld mit einem leeren Inhalt (was != Null ist).
Wir haben auch solch ein System und kompensieren das damit. Macht das Query zwar „länger“, aber das ist Wurscht. Sieht ja keiner aus uns Admins/ DBAs
Ich muss aber in der letztlich zu erstellenden Date null haben, weil die Datei in ein System hochgeladen werden soll, das leere Zellen nicht akzeptiert.
Kannst du doch mittels des Ansatzes des Kollegen @wiesi200 Kompensieren:Numerische und nicht numerische Felder fängst du im Query mit folgendem ab:
Select
ISNULL(table.myInteger, 0) as myInteger
, ISNULL(table.myString, '') as myString
FROM table
Legt Join anotherTable on blablabla
Dann erhältst du kein NULL (was bei einem CSV-Export sogar Mist wäre) sondern eine 0 bzw. ein Feld mit einem leeren Inhalt (was != Null ist).
Wir haben auch solch ein System und kompensieren das damit. Macht das Query zwar „länger“, aber das ist Wurscht. Sieht ja keiner aus uns Admins/ DBAs
Da gibt's dann auch noch CAST()
https://www.w3schools.com/sql/func_sqlserver_cast.asp
https://www.w3schools.com/sql/func_sqlserver_cast.asp
Moin,
https://www.sqlshack.com/sql-boolean-tutorial/
1. Bei einer Integer-Spalte kann ich im isnull nicht den Wert 'null' setzen, weil der ja kein Integer ist.
Du sollst ja auch 0 und nicht NULL einsetzen! Schaue bitte, was ISNULL() macht2. Statt 'null' eine 0 zu schreiben, wäre bei Bool-Spalten eine Veränderung der Bedeutung von "unbekannt" zu "nein"
Bei Spalten mit Bool nimmt man ja dann auch True/ Falsehttps://www.sqlshack.com/sql-boolean-tutorial/