我有一个存储过程查询数据库并将结果存储在Json变量中。现在我想通过索引循环遍历Json数组以获取特定值。有人能告诉我如何实现这一目标。以下是我的查询
DECLARE @json NVARCHAR(Max)
DECLARE @name VARCHAR(50) = 'Name'
SET @json = (select name from getalldataView where
SOUNDEX(name) LIKE SOUNDEX(@name) FOR JSON PATH, ROOT('Names'))
DECLARE @i int = 0
WHILE @i < lengthOFArray
BEGIN
SET @i = @i + 1;
SELECT value
FROM OPENJSON(@json, '$.Names[',@i,']');
END
答案 0 :(得分:0)
当您开始查询以选择openjson时,是否可以再添加一列,并且该值是您的循环索引。 所以你可以在开始端添加另一个Where验证。 OpenJSON读取所有json并将其插入新行。
答案 1 :(得分:0)
来源Here
示例数据
{ "type": "MultiPolygon",
"coordinates": [
[
[[40, 40], [20, 45], [45, 30], [40, 40]]
],
[
[[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]],
[[30, 20], [20, 15], [20, 25], [30, 20]]
]
]
}
Sql代码
SELECT polygons.[key] as polygon, lines.[key] as line, x, y
FROM OPENJSON(@multipolygon, '$.coordinates') as polygons
CROSS APPLY OPENJSON(polygons.value) as lines
CROSS APPLY OPENJSON(lines.value)
WITH (x float '$[0]', y float '$[1]')
答案 2 :(得分:0)
我在这个示例中具有多层json数据,并使用交叉联接将它们存储在一个表结果中
declare @jsondata nvarchar(max);
set @jsondata ='{"id":1,"planTypeId":0,"locationId":0,"auditId":0,"empId":0,"accessID":"string","actionItem":"string","resUserID":0,"createdDate":"2019-09-12T13:22:23.805Z","dueDate":"2019-09-12T13:22:23.805Z","lastModified":"2019-09-12T13:22:23.805Z","completedDate":"2019-09-12T13:22:23.805Z","completedBy":0,"status":0,"desc":"string","relQuestionID":0,"catID":0,"equipmentID":0,"steps":[{"id":1,"trnPlanId":1,"dueDate":"2019-09-12T13:22:23.805Z","type":1,"quizId":0,"taskId":0,"docCourseUrl":"string","users":[{"id":1,"empId":1,"status":true}]},{"id":2,"trnPlanId":2,"dueDate":"2019-09-12T13:22:23.805Z","type":2,"quizId":0,"taskId":0,"docCourseUrl":"string","users":[{"id":2,"empId":2,"status":true},{"id":3,"empId":3,"status":true}]}]}';
SELECT
JSON_Value (c.value, '$.id') as Id,
JSON_Value (c.value, '$.type') as planTypeId,
JSON_Value (p.value, '$.id') as userId,
JSON_Value (p.value, '$.empId') as empId
FROM OPENJSON (@jsondata, '$.steps') as c
CROSS APPLY OPENJSON (c.value, '$.users') as p
SELECT
JSON_Value (c.value, '$.id') as Id,
JSON_Value (c.value, '$.type') as planTypeId
FROM OPENJSON (@jsondata, '$.steps') as c
答案 3 :(得分:0)
类似的东西将从SQL Server 2017开始起作用。
SET @i = 0;
SET @length =
(SELECT COUNT(*)
FROM OPENJSON(@json,'$.names'))
WHILE @i < @length
BEGIN
DECLARE @driverName NVARCHAR(100);
SET @driverName = JSON_VALUE(@json,CONCAT('$.names[',@i,']'))
-- do stuff here like call stored proc...
SET @i = @i +1;
END
如果您不需要调用存储的proc,而只需要以某种方式修改JSON,您可能会发现这很有用。 https://stackoverflow.com/a/59293083/7446265