如何对数组中的数组使用JSON_MODIFY

时间:2019-07-24 11:19:40

标签: json sql-server tsql

这是我的Json字符串:

{  
   "JobID":1005,
   "ItemID":2,
   "Prefix":"CC",
   "Version":1,
   "ItemTypeID":4,
   "ItemType":"Change Control",
   "StageID":3,
   "StageName":"Change Control Closure",
   "WorkflowID":1,
   "WorkflowName":"Change Control Workflow",
   "JobStatus":0,
   "IsJobArchived":false,
   "IsJobCanceled":false,
   "IsJobOnHold":false,
   "IsJobPhasedOut":false,
   "RelationID":0,
   "JobLastUpdatedBy":"G4Admin",
   "JobStartDate":"2019-07-18T08:02:44.737718Z",
   "JobLastUpdated":"2019-07-18T08:02:44.9857249Z",
   "JobDueDate":"2019-07-23T08:02:44.8997205Z",
   "JobEstimatedDate":"2019-07-23T08:02:44.8877188Z",
   "JobCompletedDate":null,
   "RevisionNumber":1,
   "DocketNo":390,
   "JobVariance":"0",
   "Mappings":[  

   ],
   "Groups":[  
      12
   ],
   "InactiveGroups":null,
   "Attributes":[  
      {  
         "ID":22,
         "Name":"WorkflowType",
         "Value":"50",
         "DataType":"Text",
         "IsMaster":true,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"Change Control",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":18,
         "Name":"Reason for change",
         "Value":"23",
         "DataType":"Text",
         "IsMaster":true,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"CMC change",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":12,
         "Name":"Market",
         "Value":"12",
         "DataType":"Text",
         "IsMaster":true,
         "ItemData":true,
         "IsUserGroup":true,
         "GroupId":null,
         "ValueString":"Ireland",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":14,
         "Name":"Product Name",
         "Value":"34",
         "DataType":"Text",
         "IsMaster":true,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"DROXIA",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":13,
         "Name":"CCDS Impacted?",
         "Value":"15",
         "DataType":"Text",
         "IsMaster":true,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"No",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":11,
         "Name":"JobOwner",
         "Value":"G4Admin",
         "DataType":"Text",
         "IsMaster":false,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"G4Admin",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":50,
         "Name":"PartNumber",
         "Value":"CC-02-01",
         "DataType":0,
         "IsMaster":false,
         "ItemData":false,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"CC-02-01",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":50,
         "Name":"JobInitiator",
         "Value":"G4Admin",
         "DataType":0,
         "IsMaster":false,
         "ItemData":false,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"G4Admin",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":10,
         "Name":"TaskLeft",
         "Value":"3",
         "DataType":0,
         "IsMaster":false,
         "ItemData":false,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":null,
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":4,
         "Name":"ProofCycle",
         "Value":"1",
         "DataType":"Integer",
         "IsMaster":false,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"1",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":5,
         "Name":"PassCycle",
         "Value":"1",
         "DataType":"Integer",
         "IsMaster":false,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"1",
         "InactiveValue":null,
         "InactiveValueString":null
      },
      {  
         "ID":6,
         "Name":"TotalPassCount",
         "Value":"1",
         "DataType":"Integer",
         "IsMaster":false,
         "ItemData":true,
         "IsUserGroup":false,
         "GroupId":null,
         "ValueString":"1",
         "InactiveValue":null,
         "InactiveValueString":null
      }
   ],
   "LinkedParentJobs":[  

   ],
   "LinkedChildJobs":[  

   ],
   "FullText":null
}

我想更新属性中的数组...

示例:我想更改属性where Name = ProofCycle中的值。

想要一种通过Json_Modify函数更新json的动态方式。

我有一些查询要拉平json,但是json_Modify不能更改数组中的值

DECLARE @KeyValue NVARCHAR(MAX) = '{"JobID":1005,"ItemID":2,"Prefix":"CC","Version":1,"ItemTypeID":4,"ItemType":"Change Control","StageID":3,"StageName":"Change Control Closure","WorkflowID":1,"WorkflowName":"Change Control Workflow","JobStatus":0,"IsJobArchived":false,"IsJobCanceled":false,"IsJobOnHold":false,"IsJobPhasedOut":false,"RelationID":0,"JobLastUpdatedBy":"G4Admin","JobStartDate":"2019-07-18T08:02:44.737718Z","JobLastUpdated":"2019-07-18T08:02:44.9857249Z","JobDueDate":"2019-07-23T08:02:44.8997205Z","JobEstimatedDate":"2019-07-23T08:02:44.8877188Z","JobCompletedDate":null,"RevisionNumber":1,"DocketNo":390,"JobVariance":"0","Mappings":[],"Groups":[12],"InactiveGroups":null,"Attributes":[{"ID":22,"Name":"WorkflowType","Value":"50","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"Change Control","InactiveValue":null,"InactiveValueString":null},{"ID":18,"Name":"Reason for change","Value":"23","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"CMC change","InactiveValue":null,"InactiveValueString":null},{"ID":12,"Name":"Market","Value":"12","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":true,"GroupId":null,"ValueString":"Ireland","InactiveValue":null,"InactiveValueString":null},{"ID":14,"Name":"Product Name","Value":"34","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"DROXIA","InactiveValue":null,"InactiveValueString":null},{"ID":13,"Name":"CCDS Impacted?","Value":"15","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"No","InactiveValue":null,"InactiveValueString":null},{"ID":11,"Name":"JobOwner","Value":"G4Admin","DataType":"Text","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"G4Admin","InactiveValue":null,"InactiveValueString":null},{"ID":50,"Name":"PartNumber","Value":"CC-02-01","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":"CC-02-01","InactiveValue":null,"InactiveValueString":null},{"ID":50,"Name":"JobInitiator","Value":"G4Admin","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":"G4Admin","InactiveValue":null,"InactiveValueString":null},{"ID":10,"Name":"TaskLeft","Value":"3","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":null,"InactiveValue":null,"InactiveValueString":null},{"ID":4,"Name":"ProofCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null},{"ID":5,"Name":"PassCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null},{"ID":6,"Name":"TotalPassCount","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null}],"LinkedParentJobs":[],"LinkedChildJobs":[],"FullText":null}'

SELECT 
    -- Change Value to 80 where Name = 'Passcycle'
    JSON_MODIFY(@KeyValue, '$.Attributes', '80')

我得到一个空输出。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

说明:

您可以使用"Attributes" JSON路径表达式访问和修改$.Attributes[x].Value数组中的项目,其中x是该项目的索引。您需要将此路径表达式传递给JSON_MODIFY。因此,这里一种可能的方法是生成并执行动态语句。但是,如果您使用SQL Server 2017+,则可以提供一个变量作为此路径表达式的值。

动态语句(SQL Server 2016 +):

DECLARE @KeyValue NVARCHAR(MAX) = N'{"JobID":1005,"ItemID":2,"Prefix":"CC","Version":1,"ItemTypeID":4,"ItemType":"Change Control","StageID":3,"StageName":"Change Control Closure","WorkflowID":1,"WorkflowName":"Change Control Workflow","JobStatus":0,"IsJobArchived":false,"IsJobCanceled":false,"IsJobOnHold":false,"IsJobPhasedOut":false,"RelationID":0,"JobLastUpdatedBy":"G4Admin","JobStartDate":"2019-07-18T08:02:44.737718Z","JobLastUpdated":"2019-07-18T08:02:44.9857249Z","JobDueDate":"2019-07-23T08:02:44.8997205Z","JobEstimatedDate":"2019-07-23T08:02:44.8877188Z","JobCompletedDate":null,"RevisionNumber":1,"DocketNo":390,"JobVariance":"0","Mappings":[],"Groups":[12],"InactiveGroups":null,"Attributes":[{"ID":22,"Name":"WorkflowType","Value":"50","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"Change Control","InactiveValue":null,"InactiveValueString":null},{"ID":18,"Name":"Reason for change","Value":"23","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"CMC change","InactiveValue":null,"InactiveValueString":null},{"ID":12,"Name":"Market","Value":"12","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":true,"GroupId":null,"ValueString":"Ireland","InactiveValue":null,"InactiveValueString":null},{"ID":14,"Name":"Product Name","Value":"34","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"DROXIA","InactiveValue":null,"InactiveValueString":null},{"ID":13,"Name":"CCDS Impacted?","Value":"15","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"No","InactiveValue":null,"InactiveValueString":null},{"ID":11,"Name":"JobOwner","Value":"G4Admin","DataType":"Text","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"G4Admin","InactiveValue":null,"InactiveValueString":null},{"ID":50,"Name":"PartNumber","Value":"CC-02-01","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":"CC-02-01","InactiveValue":null,"InactiveValueString":null},{"ID":50,"Name":"JobInitiator","Value":"G4Admin","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":"G4Admin","InactiveValue":null,"InactiveValueString":null},{"ID":10,"Name":"TaskLeft","Value":"3","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":null,"InactiveValue":null,"InactiveValueString":null},{"ID":4,"Name":"ProofCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null},{"ID":5,"Name":"PassCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null},{"ID":6,"Name":"PassCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null}],"LinkedParentJobs":[],"LinkedChildJobs":[],"FullText":null}'

DECLARE @stm nvarchar(max) = N''
SELECT @stm = @stm + CONCAT(
   'SELECT @KeyValue = JSON_MODIFY(@KeyValue, ''$.Attributes[',
   [key],
   '].Value'', ''80''); '
)   
FROM OPENJSON(@keyValue, '$.Attributes')
WHERE JSON_VALUE([value], '$.Name') = N'PassCycle'

EXECUTE sp_executesql @stm, N'@KeyValue NVARCHAR(MAX) OUTPUT', @KeyValue OUTPUT

使用变量作为path表达式(SQL Server 2017 +):

DECLARE @KeyValue NVARCHAR(MAX) = N'{"JobID":1005,"ItemID":2,"Prefix":"CC","Version":1,"ItemTypeID":4,"ItemType":"Change Control","StageID":3,"StageName":"Change Control Closure","WorkflowID":1,"WorkflowName":"Change Control Workflow","JobStatus":0,"IsJobArchived":false,"IsJobCanceled":false,"IsJobOnHold":false,"IsJobPhasedOut":false,"RelationID":0,"JobLastUpdatedBy":"G4Admin","JobStartDate":"2019-07-18T08:02:44.737718Z","JobLastUpdated":"2019-07-18T08:02:44.9857249Z","JobDueDate":"2019-07-23T08:02:44.8997205Z","JobEstimatedDate":"2019-07-23T08:02:44.8877188Z","JobCompletedDate":null,"RevisionNumber":1,"DocketNo":390,"JobVariance":"0","Mappings":[],"Groups":[12],"InactiveGroups":null,"Attributes":[{"ID":22,"Name":"WorkflowType","Value":"50","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"Change Control","InactiveValue":null,"InactiveValueString":null},{"ID":18,"Name":"Reason for change","Value":"23","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"CMC change","InactiveValue":null,"InactiveValueString":null},{"ID":12,"Name":"Market","Value":"12","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":true,"GroupId":null,"ValueString":"Ireland","InactiveValue":null,"InactiveValueString":null},{"ID":14,"Name":"Product Name","Value":"34","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"DROXIA","InactiveValue":null,"InactiveValueString":null},{"ID":13,"Name":"CCDS Impacted?","Value":"15","DataType":"Text","IsMaster":true,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"No","InactiveValue":null,"InactiveValueString":null},{"ID":11,"Name":"JobOwner","Value":"G4Admin","DataType":"Text","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"G4Admin","InactiveValue":null,"InactiveValueString":null},{"ID":50,"Name":"PartNumber","Value":"CC-02-01","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":"CC-02-01","InactiveValue":null,"InactiveValueString":null},{"ID":50,"Name":"JobInitiator","Value":"G4Admin","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":"G4Admin","InactiveValue":null,"InactiveValueString":null},{"ID":10,"Name":"TaskLeft","Value":"3","DataType":0,"IsMaster":false,"ItemData":false,"IsUserGroup":false,"GroupId":null,"ValueString":null,"InactiveValue":null,"InactiveValueString":null},{"ID":4,"Name":"ProofCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null},{"ID":5,"Name":"PassCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null},{"ID":6,"Name":"PassCycle","Value":"1","DataType":"Integer","IsMaster":false,"ItemData":true,"IsUserGroup":false,"GroupId":null,"ValueString":"1","InactiveValue":null,"InactiveValueString":null}],"LinkedParentJobs":[],"LinkedChildJobs":[],"FullText":null}'

SELECT @KeyValue = JSON_MODIFY(@KeyValue, '$.Attributes[' + [key] + '].Value', '80')
FROM OPENJSON(@keyValue, '$.Attributes')
WHERE JSON_VALUE([value], '$.Name') = N'PassCycle'

注释:

两个示例都将修改条件为JSON的{​​{1}}数组中的所有项目(不仅是一项)。