2017-12-07 2 views
0

Ich muss Daten in einer SQL Server-Datenbank in großen Mengen importieren.Massenimport von JSON in SQL Server

Meine JSON sieht wie folgt aus:

$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) 

Unfortunatelly, ich erhalte immer diese Fehlermeldung:

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

Was ist der richtige Weg wäre viel JSON-Daten in SQL Server zu importieren?

TIA

+0

Ich kenne nicht das 'Data.SqlClient.SqlBulkCopy' Objekt, aber es ist eindeutig etwas falsch mit dem' $ dt2' Objekt; Zuerst definieren Sie es als 'DataTable' und dann überschreiben Sie es mit einem Array von' PSCustomObject'. Es gibt mehrere Seiten, die beschreiben, wie man eine DataTable erstellt, zB: http://www.intrntpirate.com/2014/09/26/creating-a-data-table-in-powershell/ – iRon

+0

Ich schätze, das ist einfach Lösung: https://gist.github.com/gravejester/3052e0e54e35bebc3257 und nehme an, dies ist die Syntax: '$ dt2 = $ projects | select-object-ID, created_at, customer_id, Name, Notiz, aktualisierter_at, archiviert, Kundenname | ConvertTo-DataTable' (beachten Sie, beachten Sie die 'Note' in Ihrem zweiten Objekt ist kein' [string] ') – iRon

Antwort

2

Wie @IRon merkt man dt2 zweimal $ füllen. Ich nehme an, Sie wollen mit der zweiten Initialisierung gehen.

Sie könnten von hier Out-Datatable erhalten: https://gallery.technet.microsoft.com/scriptcenter/4208a159-a52e-4b99-83d4-8048468d29dd

Dann ist es nur eine Frage der

$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) 

Haftungsausschluss Aufruf: ich das selbst nicht versucht haben.

+0

Thanx. Ich bekam Out-DataTable von: https://github.com/RamblingCookieMonster/PowerShell – Mara