使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016

Posted

技术标签:

【中文标题】使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016【英文标题】:Insert JSON into SQL Server 2016 using C# and OPENJSON 【发布时间】:2017-09-16 23:17:42 【问题描述】:

我正在尝试使用 OPENJSON 将数据插入到我的数据库中,用 C# 编写代码。

我已成功插入所需的 JSON 对象,但我只能执行一次 - 这不是目标。我想用这种方式将多个 JSON 对象插入数据库并保留在那里。

我使用的 SQL 字符串是这样的:

@"SELECT BulkColumn INTO unparsed2 FROM OPENROWSET(BULK 'C:\\JSON\\data.json', SINGLE_CLOB) as j";

出于测试目的,代码只运行一次。如果我再次执行它,我会收到以下消息:

数据库中已经有一个名为“unparsed2”的对象。

我还尝试在 T-SQL 脚本中将对象作为参数传递,这会导致错误(但在第一个键值附近收到错误 - 可能是由于 json 对象中的分号)。

@"declare @json nvarchar (max) = " +json_object+ " "INSERT INTO unparsed SELECT * FROM OPENJSON(@json) AS json)";

“设备”附近的语法不正确。

我的 JSON 对象:


  "device":"1234",
  "status":1,
  "level":100,
  "dni":true,
  "value":50

【问题讨论】:

【参考方案1】:

创建表后,您不能再次创建它(SELECT ... INTO 将创建表)。请改用标准插入语法;

@"INSERT unparsed2 (BulkColumn) SELECT BulkColumn FROM OPENROWSET(BULK 'C:\\JSON\\data.json', SINGLE_CLOB) as j";

【讨论】:

没想到!谢谢,像魅力一样工作!跟进问:如果我已经有一个 JSON 对象(不在文件中),我如何在 T-SQL 中将它作为参数传递? ... (BULK 'json object' , SINGLE_CLOB) ... 当您说 JSON 对象时...您是指在 SQL 变量中吗?还是在您的 C# 代码中?如果 C# - 使用 SqlParameter,类似这样:csharp-station.com/Tutorial/AdoDotNet/Lesson06 在我的 C# 代码中。它是 Newtonsoft 包中的“JObject”。所以根据教程,我只需要声明参数,然后使用“ParameterName”将它添加到命令中。对吗? 我收到此错误:“不存在从对象类型 Newtonsoft.Json.Linq.JObject 到已知托管提供程序本机类型的映射。” cmd.Connection = conn; SqlParameter param = new SqlParameter(); param.ParameterName = "@json"; param.Value = o2; cmd.Parameters.Add(param); cmd.CommandText = @"INSERT unparsed2 (BulkColumn) SELECT BulkColumn FROM OPENROWSET(BULK '@json', SINGLE_CLOB) as j"; try conn.Open(); cmd.ExecuteNonQuery(); catch (SqlException e) 你可能需要做 o2.ToString() ??

以上是关于使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?

如何使用 OpenJson 将 JSON 列标题转换为小写

OpenJson 使用通配符

OPENJSON 不会将所有文档都选择到 SQL 表中

使用 OPENJSON 跳过 OBJECTS 解析 JSON SQL

SQL Server中的OpenJson用于嵌套的json数据?