Null

無法在 Powershell 中將 DBNull 寫入 SQL

  • March 16, 2018

在 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 表,我們將看到它有效

在此處輸入圖像描述

如果您有其他更好的想法,請分享給社區。

引用自:https://dba.stackexchange.com/questions/181537