首页 > 解决方案 > 将 JSON 数据导入 SQL Server;失去小数精度和比例

问题描述

我正在导入一组 JSON 文档,如下所示:

{
  "_id": {
    "$oid": "6092e24247f3024d478902c2"
  },
  "startSearch": "2021-05-05T18:20:50.132Z",
  "Inst_ID": 856,
  "hostname": "localhost",
  "searchpath": "/Account/Main/_LookupOptimize",
  "Params": {
    "AccountStatusDisplay": [
      "Active",
      "Out For Repo",
      "Repossessed"
    ]
  },
  "endSearch": "2021-05-05T18:20:53.993Z",
  "elapsedTime": 3.861,
  "totalRecordsFound": 1988
}

我将它们导入到 SQL Server 2019 的本地实例中,如下所示:

Declare @JSON nvarchar(max)
SELECT @JSON=BulkColumn
FROM OPENROWSET (BULK 'C:\temp\QueueSearch.JSON', SINGLE_CLOB) import

INSERT INTO myJSON
SELECT * 
FROM OPENJSON (@JSON)
WITH 
(
    [_id] nvarchar(max),
    [startSearch] datetime,
    [Inst_ID] int,
    [hostname] nvarchar(80),
    [searchpath] nvarchar(50),
    [Params] nvarchar(max),
    [endSearch] datetime,
    [elapsedTime] NUMERIC(10,4),
    [totalRecordsFound] int
)

我的问题是 elapsedTime 值被四舍五入为整数。(_id 值也没有被导入,但首先要做的事情。)我可能遗漏了一些非常简单的东西,但我怎样才能保持我的 elapsedTime 值的准确性?提前致谢!

标签: jsonsql-serverdata-import

解决方案


验证 elapsedTime 的数据类型是numeric(10,4)并显式映射 INSERT 中的列,以确保您elapsedTime从 JSON 插入到elapsedTime列中。

INSERT INTO myJSON([_id],startSearch,Inst_ID,hostname,searchpath,Params,endSearch,elapsedTime,totalRecordsFound)
SELECT * 
FROM OPENJSON (@JSON)
WITH 
(
    [_id] nvarchar(max),
    [startSearch] datetime,
    [Inst_ID] int,
    [hostname] nvarchar(80),
    [searchpath] nvarchar(50),
    [Params] nvarchar(max),
    [endSearch] datetime,
    [elapsedTime] NUMERIC(10,4),
    [totalRecordsFound] int
)

推荐阅读