【问题标题】:Importing JSON data into SQL Server; losing decimal precision and scale将 JSON 数据导入 SQL Server;失去小数精度和比例
【发布时间】:2021-08-13 04:32:34
【问题描述】:

我正在导入一组 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 值的准确性?提前致谢!

【问题讨论】:

  • openjson() 代码看起来不错,除了缺少 [Params] nvarchar(max) as json。那么myJSON表的定义是什么?
  • 我怀疑您的表已 elapsedTime 定义为整数。没有插入的选择返回正确的值
  • 您可能还想要[_id] nvarchar(max) '$._id."$oid"[_id] nvarchar(max) as json

标签: json sql-server data-import


【解决方案1】:

验证 elapsedTime 的数据类型是 numeric(10,4) 并显式映射 INSERT 中的列,以确保您将 JSON 中的 elapsedTime 插入到 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
)

【讨论】:

  • 谢谢@David!原来我的目标表的列设置为十进制(18,0)。 不过,我仍然想知道 _id 和 Params 列发生了什么;它们是源中的 JSON 子文档,但目标列是 NULL。
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2020-05-02
  • 2011-11-15
  • 2021-02-09
相关资源
最近更新 更多