批量导入JSON到SQL Server

时间:2017-12-07 13:31:55

标签: json sql-server powershell psobject

我需要将数据批量导入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)

不幸的是,我一直收到这个错误:

  

无法转换参数“rows”,值为:“System.Object []”,for   “WriteToServer”键入“System.Data.DataRow []”:“无法转换   “@ {id = 35; created_at = 2016-01-12T11:40:36 + 01:00; customer_id = 34;   命名= .COM;注意= COMXXXX-;的updated_at = 2016-07-15T12:13:54 + 02:00;   存档= FALSE; customer_name = PMName}“类型的值   键入“Selected.System.Management.Automation.PSCustomObject”   “System.Data.DataRow”。“在P:\ PsideSync \ sync.ps1:261 char:3   + $ bulkCopy.WriteToServer($ dt2)   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:NotSpecified:(:) [],MethodException       + FullyQualifiedErrorId:MethodArgumentConversionInvalidCastArgument

将大量JSON数据导入SQL Server的正确方法是什么?

TIA

1 个答案:

答案 0 :(得分:4)

正如@IRon所说,你两次填补$ dt2。我假设你想进行第二次初始化。

您可以从此处获取Out-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)

免责声明:我自己没试过。