【问题标题】:JSON Value into SQL Server将 JSON 值转换为 SQL Server
【发布时间】:2021-08-31 21:03:19
【问题描述】:

我需要将值插入表中。我必须创建存储过程。这个 SP 是 API 的一部分,当用户在 UI 上“保存”数据时,这个 API 会调用并执行这个 SP。下面如果是 JSON 格式,我从 UI 中得到。

 CREATE TABLE dbo.test 
 (
      Quarter,
      Entity,
      Schooldetails, 
      Teachername,
      Teachid,
      Observation
)

CREATE TABLE dbo.test1 
(
     username,
     Age,
     Id,
     CtrName,
     Rank,
     Levelid,
     business
) - two records will be inserted


"Easy" : {
   "Quarter": "2nd Q"
   "Entity": "ABC"
   "Schooldetails": [{
 "Username": "Dinesh,K",
 "Age": "45",
 "Id": "1"
     }, {
   "Username": "Dinesh,K",
    "Age": "45",
    "Id": "1"
   }
 ],
 "Teachername": "Suni",
 "Teachid" : "123",
 "Additionalinfo":[{
    "CtrName": "test1",
    "Rank": "1",
    "Levelid": "lvl1",
    "business": "forest"
 },{
    "CtrName": "test2",
    "Rank": "2",
    "Levelid": "lvl2",
    "business": "air"
 }
 ],
 "Observation": "1"
 }

我试过了,但没有用。它抛出一个错误......当我尝试使用邮递员时。 邮递员的错误信息:

JSON 文本格式不正确。在第 9 位发现意外字符“{”。

CREATE PROCEDURE DBO.TEST @easy VARCHAR(max) 
as
Begin
  Set @json = '{ "Easy": {' + @easy + '} }'

begin try
 begin trans

insert into dbo.test 
 (
      Quarter,
      Entity,
      Schooldetails, 
      Teachername,
      Teachid,
      Observation
)
(
select JSON_Value (a.value, '$.Quarter')  Quarter,
JSON_Value (a.value, '$.Entity')  Entity,
JSON_Value (a.value, '$.Schooldetails')  Schooldetails,
JSON_Value (a.value, '$.Teachername')  Teachername,
JSON_Value (a.value, '$.Teachid')  Teachid,
JSON_Value (a.value, '$.Observation')  Observation from OPENJSON(@json, '$.easy') as easy

insert into dbo.test1
 (
     username,
     Age,
     Id,
     CtrName,
     Rank,
     Levelid,
     business
)
(
select JSON_Value (a.value, '$.username')  username,
JSON_Value (a.value, '$.Age')  Age,
JSON_Value (a.value, '$.Id')  Id,
JSON_Value (a.value, '$.CtrName)  CtrName,
JSON_Value (a.value, '$.Rank')  Rank,
JSON_Value (a.value, '$.Levelid')  Levelid,
JSON_Value (a.value, '$.business')  business
 from OPENJSON(@json, '$.easy') as easy1 CROSS APPLY OPENJSON(easy1.value, '$.Schooldetails') as b
)

insert into dbo.test1
 (
     username,
     Age,
     Id,
     CtrName,
     Rank,
     Levelid,
     business
)
(
select 
JSON_Value (a.value, '$.CtrName)  CtrName,
JSON_Value (a.value, '$.Rank')  Rank,
JSON_Value (a.value, '$.Levelid')  Levelid,
JSON_Value (a.value, '$.business')  business
 from OPENJSON(@json, '$.easy') as easy1 CROSS APPLY OPENJSON(easy1.value, '$.Additionalinfo') as b
)

【问题讨论】:

  • 你想从JSON字符串中读取数据并插入到上面提到的2个sql server表中吗?
  • 是的,我想把上面的json分成两个表。
  • 您的 JSON 无效。它需要一个起始大括号,第 2 行和第 3 行末尾的逗号,并且不需要额外的结束大括号。没有 Schooldetails 属性,因此不清楚您在那里尝试做什么。如果你CROSS APPLY 两次,你会得到重复的行

标签: sql json sql-server


【解决方案1】:

"OPENJSON 是一个表值函数,有助于在 SQL 中解析 JSON 服务器返回 JSON 文本的数据值和类型 表格格式。现在,我们来看看这个函数的语法。”

OPENJSON( jsonExpression  [, jsonPath ] )
[ WITH (column_mapping_definition1
        [,column_mapping_definition2] 
        [,… column_mapping_definitionN])
]

https://www.sqlshack.com/how-to-parse-json-in-sql-server/

*在建议回答后编辑问题后编辑*

您在以下第二行和第三行 select 子句中缺少单引号:

JSON_Value (a.value, '$.CtrName)  CtrName,

请改成以下:

JSON_Value (a.value, '$.CtrName')  CtrName,

【讨论】:

  • 建议如何解决问题并不是一个答案——也许是一个有用的评论。答案需要完全回答问题。
  • 我用代码试过了。,..docs.microsoft.com/en-us/answers/questions/437941/… 但没用
  • @DineshKal 您使用的是哪个版本的 SqlServer,究竟什么不起作用?你遇到了什么错误?
  • @DineshKal 你在这一行缺少单引号:JSON_Value (a.value, '$.CtrName) CtrName,
猜你喜欢
  • 1970-01-01
  • 2022-08-12
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多