Null
無法在 Powershell 中將 DBNull 寫入 SQL
在 Powershell 中,我有一些
.csv
從[DBNull]::Value
.問題是當我去使用
Write-SqlTableData
我得到這個錯誤:
Write-SqlTableData : Invalid storage type: DBNull.
我正在使用此程式碼來檢測空格並將它們替換為
DBNull
‘s:$DataOut | Foreach-Object { ForEach ($Property in $_.PSObject.Properties) { If([String]::IsNullOrEmpty($Property.Value)) { $_.($Property.Name) = [DBNull]::Value } } }
這裡有什麼問題?什麼是替代方案?
我遇到了完全相同的問題,我來到這個網頁。但除了 Shawn Metlton 在評論中提到使用 write-dbadatatable 之外,它確實沒有解決問題。
由於原始海報@discipline 沒有給出整個 PS 腳本,我無法解決他的問題。但是經過一小時的嘗試,我弄清楚瞭如何完成這項工作。
所以這裡是如何重複相同的錯誤資訊
我們首先在
$$ TempDB $$在我的本地 sql server 實例上
use tempdb if object_id('dbo.t', 'U') is not null drop table dbo.t; create table dbo.t (name varchar(100), gender varchar(10), id int)
現在我們寫幾行PS程式碼如下:
$p = [pscustomobject] @{name='jeffrey'; gender='male'; city='Toronto'} #this can be successful Write-SqlTableData -ServerInstance localhost -DatabaseName tempdb -SchemaName dbo -TableName t -InputData $p;
執行後,我們可以查看sql表,看到確實成功瞭如下圖
現在,如果我們將 $p 更改為
$$ city $$DBNull 的屬性如下
$p = [pscustomobject] @{name='jeffrey'; gender='male'; city=[dbnull]::Value} #this will fail Write-SqlTableData -ServerInstance localhost -DatabaseName tempdb -SchemaName dbo -TableName t -InputData $p;
我們可以看到以下錯誤
另一種解決方案是創建一個system.data.datatable,然後將對象值傳遞給這個datatable,然後將datatable傳遞給write-sqltabledata,如下所示
$dt = new-object 'System.Data.DataTable'; $dt.Columns.Add((new-object System.Data.DataColumn('name', [System.String]))); $dt.Columns.Add((new-object System.Data.DataColumn('gender', [System.String]))); $dt.Columns.Add((new-object System.Data.DataColumn('city', [System.String]))); $p = [pscustomobject] @{name='jeffrey'; gender='male'; city=[dbnull]::Value} $p | % {$r = $dt.NewRow(); $r.name=$_.name; $r.gender=$_.gender; $r.city=$_.city; $dt.rows.add($r);} #this will succeed Write-SqlTableData -ServerInstance localhost -DatabaseName tempdb -SchemaName dbo -TableName t -InputData $dt;
現在,如果我們再次查詢 sql 表,我們將看到它有效
如果您有其他更好的想法,請分享給社區。