Ich versuche, Werte aus einer CSV-Datei zu lesen, sie in eine INSERT T-SQL-Anweisung einzubetten und diese Anweisung mit Invoke-Sqlcmd auszuführen.Übergabe mehrerer Variablen aus der CSV-Datei an invoke-sqlcmd
Hier ist mein Code:
Push-Location; Import-Module SQLPS -DisableNameChecking; Pop-Location
$InsertQry = "insert into $ImportTable VALUES ('`$(Col1)','`$(Col2)','`$(Col3)','`$(Col4)') "
Import-CSV $ImportFile | ForEach-Object { `
$RowData = "Col1=$($_.{My Ref})","Col2=$($_.{General satisfaction})","Col3=$($_.Helpfulness)","Col4=$($_.Effort)"
Invoke-Sqlcmd `
-Database $DBName -ServerInstance $SQLServer `
-Query $InsertQry `
-Variable $RowData
}
Das Skript arbeitet für die Zeilen in der CSV-Datei in Ordnung, die Werte für jede Spalte enthalten. Leider enthalten einige Zeilen in der CSV-Datei leere Werte (daher enthalten möglicherweise nur die ersten beiden Spalten Werte). Diese Zeilen nicht eingefügt in die Tabelle werden, und erzeugen die folgenden Fehler:
Invoke-Sqlcmd : The format used to define the new variable for Invoke-Sqlcmd cmdlet is invalid. Please use the 'var=value' format for defining a new variable.
Die möglicherweise leere Spalten sind alle Spalten, die entweder leer oder enthalten eine einstellige Zahl 1 bis 5.
sind I‘ Ich habe verschiedene Möglichkeiten ausprobiert, um den Wert zu umgehen, ihn in einen anderen Datentyp umzuwandeln, ihm eine Null oder eine leere Zeichenfolge hinzuzufügen, null koaleszieren, aber ich kann keine Lösung finden, die funktioniert.
Ich habe die Kontrolle über die Zieltabelle, so würde ich gerne Null, leere Zeichenfolge, null oder einen anderen Wert als Platzhalter für die leeren Werte übergeben.
Danke Matt. Dieser Ansatz funktioniert, und" splatting " Ich denke, dies eröffnet die Möglichkeit von SQL-Injection-Angriffen, so dass es mit Vorsicht verwendet werden muss, aber das stellt in diesem speziellen Fall kein Problem dar. Ich bin mir nicht ganz sicher, ob mein ursprünglicher Ansatz besser war aber in dieser Hinsicht? – paulH