2017-12-07 40 views
0

SQL Serverデータベースにデータを一括インポートする必要があります。JSONをSQL Serverに一括インポートする

私のJSONは次のようになります。

生憎
$projectsJSON = @" 
[ 
    { 
     "id": 35, 
     "created_at": "2016-01-12T11:40:36+01:00", 
     "customer_id": 34, 
     "name": ".com", 
     "note": "COMXXXX-", 
     "updated_at": "2016-07-15T12:13:54+02:00", 
     "archived": false, 
     "customer_name": "PMName" 
    }, 
    { 
     "id": 23, 
     "created_at": "2010-01-11T12:58:50+01:00", 
     "customer_id": 43, 
     "name": "PN", 
     "note": "{\r\n \"Billable\": 1\r\n}\r\n", 
     "updated_at": "2017-11-24T15:49:31+01:00", 
     "archived": false, 
     "customer_name": "MSM" 
    } 
] 
"@ 

$projects = $projectsJSON |ConvertFrom-Json 
$dt2 = New-Object system.Data.DataTable 
$dt2 = $projects|select-object id, created_at, customer_id, name, note, updated_at, archived, customer_name 

$bulkCopy = New-Object Data.SqlClient.SqlBulkCopy($DestConnStr, [System.Data.SqlClient.SqlBulkCopyOptions]::KeepIdentity) 
$bulkCopy.BulkCopyTimeout = 600 
$bulkCopy.DestinationTableName = "project" 
$bulkCopy.WriteToServer($dt2) 

、私はこのエラーを取得しておいてください。

Cannot convert argument "rows", with value: "System.Object[]", for "WriteToServer" to type "System.Data.DataRow[]": "Cannot convert the "@{id=35; created_at=2016-01-12T11:40:36+01:00; customer_id=34; name=.com; note=COMXXXX-; updated_at=2016-07-15T12:13:54+02:00; archived=False; customer_name=PMName}" value of type "Selected.System.Management.Automation.PSCustomObject" to type "System.Data.DataRow"." At P:\PsideSync\sync.ps1:261 char:3 + $bulkCopy.WriteToServer($dt2) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodException + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

SQL ServerにJSONデータの多くをインポートする正しい方法でしょうか?

TIA

+0

私は 'Data.SqlClient.SqlBulkCopy'オブジェクトを知りませんが、明らかに' $ dt2'オブジェクトに何か問題があります。まずそれを 'DataTable'として定義し、' PSCustomObject'の配列で上書きします。 DataTableを構築する方法を記述するいくつかの側面があります。例:http://www.intrntpirate.com/2014/09/26/creating-a-data-table-in-powershell/ – iRon

+0

これは簡単だと思いますソリューション:https://gist.github.com/gravejester/3052e0e54e35bebc3257これは構文です: '$ dt2 = $ projects |選択オブジェクトID、created_at、customer_id、名前、メモ、updated_at、アーカイブ済み、顧客名| ConvertTo-DataTable'(btw。2番目のオブジェクトの 'note'は' [string] 'ではありません) – iRon

答えて

2

@IRonは$ dt2を2回書きます。私はあなたが2番目の初期化に行きたいと思っています。

あなたがここから出て、DataTableの得ることができます:https://gallery.technet.microsoft.com/scriptcenter/4208a159-a52e-4b99-83d4-8048468d29dd

は、その後、それは

$projects = $projectsJSON |ConvertFrom-Json 
$dt2 = $projects|select-object id, created_at, customer_id, name, note, updated_at, archived, customer_name 

$bulkCopy = New-Object Data.SqlClient.SqlBulkCopy($DestConnStr, [System.Data.SqlClient.SqlBulkCopyOptions]::KeepIdentity) 
$bulkCopy.BulkCopyTimeout = 600 
$bulkCopy.DestinationTableName = "project" 
$bulkCopy.WriteToServer($dt2 | Out-DataTable) 

免責を呼び出すだけの問題だ:私はこの自分自身を試していません。

+0

Thanx。 Out-DataTableは https://github.com/RamblingCookieMonster/PowerShellから取得しました。 – Mara

関連する問題