首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server:基于JSON更新表

SQL Server:基于JSON更新表
EN

Stack Overflow用户
提问于 2018-08-06 01:53:44
回答 3查看 4.5K关注 0票数 2

我正在尝试基于JSON更新表中的行。JSON的结构如下:

代码语言:javascript
复制
"sensors": [
{
  "id": "5afd7160f16819f11814f6e2",
  "num": 0,
  "name": "AC01",
  "enabled": true,
  "unit": "Volt AC Phase 1",
  "desc": "NAMsdafE",
  "lt_disaster": 1,
  "gt_disaster": 1,
  "lt_high": 1,
  "gt_high": 1,
  "lt_average": 1,
  "gt_average": 1
},...

dbo.sensors具有相同的结构+更多的列。为了将这样的JSON对象,而不是数组,插入到表中,我会这样做:

代码语言:javascript
复制
INSERT INTO dbo.sensors (.......)
  SELECT .......
  FROM OPENJSON(@json)
  WITH (
    id varchar(200),
    ....
  );

所以我有两个问题:如何迭代JSON数组中的每个元素,并用相同的id更新每一行。如有任何帮助,我们将不胜感激:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-06 02:49:46

首先,请阅读文档OPENJSON。此功能从2016版本开始可用。

接下来,应用新知识。

代码语言:javascript
复制
--truncated for shortness
--note: wrap JSON string in curly brackets {}
declare @json nvarchar(max)='{"sensors":[
{
  "id": "5afd7160f16819f11814f6e2",
  "num": 0,
  "name": "AC01",
  "more": "unused"
},
{  "id": "5afd7160f16819f11814f6e3",
  "num": 0,
  "name": "AC02"
}]}
'

--insert... 
select * from 
openjson(@json,'$.sensors') --note the "path" argument here
with(
id varchar(200),
num int,
name varchar(10)
) json --alias sometimes required.

可以使用result (行集),因为它是一个表。

票数 3
EN

Stack Overflow用户

发布于 2018-08-06 02:51:45

1)一旦将json更改为select语句,就可以使用游标遍历该语句。

2)您可以将json select语句看作一个表。也就是说,您可以像处理两个表一样执行insert、update、delete操作。对于更新后的案例,您可以使用如下代码:

代码语言:javascript
复制
With Json_data as 
( SELECT .......
  FROM OPENJSON(@json)
  WITH (
    id varchar(200),
    ....
  )

update S set ....
from dbo.sensors as S 
inner join Json_data as JD on JD.id = S.id
票数 4
EN

Stack Overflow用户

发布于 2020-04-20 22:37:06

代码语言:javascript
复制
;With Json_data as 
( SELECT 
Evaluation_IDNO,            
Rating_IDNO,                
Notes_TEXT,             
NextSteps_TEXT,         
EvaluationCategory_CODE,
EvalType_ID            
  FROM OPENJSON(@As_EvaluationCategory_Json) WITH
            (   
                Evaluation_IDNO         INT             N'$.matrixId',                  
                Rating_IDNO             VARCHAR(150)    N'$.ratingValue',                       
                Notes_TEXT              VARCHAR(MAX)    N'$.notesText',
                NextSteps_TEXT          VARCHAR(MAX)    N'$.nextStepsText',
                EvaluationCategory_CODE VARCHAR(50)     N'$.ratingData',
                EvalType_ID             VARCHAR(4)     N'$.evalTypeId'
            )
            AS EvaluationCategories
        )

UPDATE EvaluationRatings_T1 SET
UserCreatedBy_ID=@As_SignedOnWorker_ID,
User_ID=@Ls_User_Id,
WorkspaceCreatedBy_ID=@Ls_WorkspaceCreatedBy_Id,
BeginValidity_DTTM=@Ls_Evaluation_DTTM,
EndValidity_DTTM=@Ld_HighValidity_DTTM,
TransactionEvenSeq_NUMB=@An_TransactionEventSeq_NUMB,
Update_DTTM=@Ld_BeginValiditiy_DTTM,
WorkspaceUpdatedBy_ID=@Ls_WorkspaceUpdatedBy_ID,
Evaluation_IDNO=c1.Evaluation_IDNO,
Rating_IDNO=c1.Rating_IDNO,
Notes_TEXT=c1.Notes_TEXT,
NextSteps_TEXT=c1.NextSteps_TEXT,
EvaluationCategory_CODE=c1.EvaluationCategory_CODE,
EvalType_ID=c1.EvalType_ID 
FROM Json_data c1
inner JOIN EvaluationRatings_T1 e1 on e1.Evaluation_IDNO=c1.Evaluation_IDNO
WHERE e1.Evaluation_IDNO=@AS_Evaluation_IDNO;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51696885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档