使用 PowerShell 4.0 和 SQL-Server,我想將記錄從一個資料庫合并到另一個資料庫。我使用 export-csv 和 import-csv。我從一個資料庫匯出到 csv 檔案,然后從 csv 檔案匯入到另一個資料庫中的臨時表,用于后續的 MERGE。
表 A 是
([ID] int not null,
[Name] varchar(25) not null,
[StartDate] datetime null,
[Department] varchar(25) not null)
值為 ID=1、Name=Joe、StartDate=NULL、Department=Sales
exportTable.ps1(忽略資料庫配置)
Invoke Sqlcmd ("SELECT FROM TableA WHERE ID=1") | Export-Csv -path a.csv -NoTypeInformation -Append
這導致 a.csv
"ID","Name","StartDate","Department"
"1","Joe","","Sales"
匯入表.ps1
CreateTable TableATemporary
([ID] int not null,
[Name] varchar(25) not null,
[StartDate] datetime null)
Import-Csv a.csv | ForEach-Object {
$allValues = "'" ($_.Psobject.Properties.Value -join "','") "'"
Invoke Sqlcmd ("INSERT INTO TableATemporary VALUES $allValues")
這給出了一個值表,其中 ID=1、Name=Joe、StartDate=1900-01-01 00:00:00:000、Department=Sales
datetime 欄位不是空條目,而是默認值,因為 csv 檔案中的欄位是“”
Export-Csv cmdlet 有沒有辦法為資料庫中的空欄位而不是 "" 寫入 csv 檔案?
uj5u.com熱心網友回復:
Import-Csv總是回傳空白字串,但是$null如果它們為空,有很多方法可以將這些值設定為。例如,在這里我在加入它們之前檢查空白值:
Import-Csv a.csv | ForEach-Object {
# convert empty strings to null
$allValues = '"' (($_.Psobject.Properties.Value | ForEach-Object {
if($_){"'$_'"} else{''} }) -join ',') '"'
Invoke-Sqlcmd ("INSERT INTO TableATemporary VALUES $allValues")
}
現在它不再設定空字串$allvalues:
"'1','Joe',,'Sales'"
我建議使用Write-SqlTableData用于匯入而不是為每一行運行 sqlcmd,但這只是一個效率問題。
uj5u.com熱心網友回復:
Cpt.Whale 的有用答案顯示了如何在為 SQL 陳述句構造的引數串列中無條件地表示空字串欄位值而不嵌入引號 ( ''),以便將它們視為未指定。
如果您想明確控制哪些欄位應該以這種方式運行,您可以嘗試以下(簡化示例):
[pscustomobject] @{ ID = '1'; Name = 'Joe'; StartDate = ''; Department = '' } |
ForEach-Object {
$_.psobject.Properties.ForEach({
# Determine whether to quote the field value at hand.
# Specify the names of one ore more fields (,-separated) as the RHS of -in,
# for which empty values should be left as-is (no quoting).
$quoteChar = ("'", '')[$_.Name -in 'StartDate' -and '' -eq $_.Value]
'{0}{1}{0}' -f $quoteChar, $_.Value, $quoteChar
}) -join ','
}
輸出(注意空值如何不StartDate被參考,而 forDepartment被參考):
'1','Joe',,''
注意:理想情況下,是否參考應該由值的資料型別來指導,但 CSV 資料根據定義都是字串型別的。
或者,參考/如何格式化值的決定可以基于將 CSV 列(欄位)名稱映射到其最終目標資料型別的哈希表(字典)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/416700.html
標籤:
上一篇:PowerShell--匯入csv、重新格式化日期值、匯出csv
下一篇:批量洗掉資料庫記錄
