数据传输:JSON → SQL

Data transfer: JSON → SQL

我想请您帮忙。 在我们的制作中,我想传输多种数据,因此我决定为此选择使用 JSON。 我已经在应用程序端创建了包含所有数据的 JSON 字符串,现在我需要使用存储过程将其存储到我的数据库中。 一切都很好,但在某些情况下我遇到了一个小问题。

请求

我需要知道应该将多少有缺陷的零件发送到某个过程(需要知道:哪个过程、什么缺陷以及有多少...)

Sorry for this confused description, but bellow is an example

这是 JSON 中我需要转换的部分:
{"production":{"repairs":{"2":{"1":3},"4":{"3":5},"7":{"2":2,"4":4}}}}
这是所需的输出:
RowID ProcessID ErrorID Amount
1 2 1 3
2 4 3 5
3 7 2 2
4 7 4 4
测试:

这是一些 SQL 脚本,它正是我想要的,但我不能使用它,因为它在存储过程中不起作用...

DECLARE @json NVARCHAR(MAX) = '{"production":{"repairs":{"2":{"1":3},"4":{"3":5},"7":{"2":2,"4":4}}}}'

DECLARE @helper INT = 0
DECLARE @counter INT = 0

DECLARE @RepairData TABLE (RowID INT NOT NULL IDENTITY, ProcessID INT, ErrorID INT, Amount INT)

SELECT ROW_NUMBER() OVER(ORDER BY CAST("key" AS INT) ASC) AS 'Row', CAST("key" AS INT) AS 'ProcessID'
INTO #RepairProcesses
FROM OPENJSON(@json, '$.production.repairs')

WHILE @counter < (SELECT COUNT("key") FROM OPENJSON(@json, '$.production.repairs'))
BEGIN
    SET @counter = @counter + 1
    SET @helper = (SELECT ProcessID FROM #RepairProcesses WHERE Row = @counter)

    INSERT INTO @RepairData (ProcessID, ErrorID, Amount)
    SELECT @helper AS 'ProcessID', CAST("key" AS INT) AS 'ErrorID', CAST("value" AS INT) AS 'Amount'
    FROM OPENJSON(@json, '$.production.repairs."'+CAST(@helper AS NVARCHAR(3))+'"')
END

DROP TABLE #RepairProcesses

SELECT * FROM @RepairData
输出:
RowID|ProcessID|ErrorID|Amount|
-----+---------+-------+------+
    1|        2|      1|     3|
    2|        4|      3|     5|
    3|        7|      2|     2|
    4|        7|      4|     4|
总结:

我不能使用它的原因是因为我在其中使用了 ProcessID 的 WHILE 循环和迭代以及一些 存储过程在函数 OPENJSON[ 中使用 路径字符串 的串联的行中出现 return 语法错误 =57=]。 (即使它在经典的“查询模式”下运行良好...

错误消息(仅在存储过程中):
SQL Error [102] [S0001]: Incorrect syntax near '+'.

The error occurs even when I don't use the concatenation and use the whole path string as the parameter... Seems like the function OPENJSON in stored procedures needs for the path string only absolute value in the ' '...

我的要求:

伙计们,我想问问你是否有人知道如何以更好的方式解决它(甚至可能没有 WHILE 循环?)...

非常感谢。

我想你需要这个:

DECLARE @json NVARCHAR(MAX) = '{"production":{"repairs":{"2":{"1":3},"4":{"3":5},"7":{"2":2,"4":4}}}}'

SELECT
   RowId = ROW_NUMBER() OVER (ORDER BY CONVERT(int, j1.[key]), CONVERT(int, j2.[key])),
   ProcessID = j1.[key],    
   ErrorID = j2.[key],
   Amount = j2.[value]
FROM OPENJSON(@json, '$.production.repairs') j1
CROSS APPLY OPENJSON(j1.value) j2

结果:

RowId ProcessID ErrorID Amount
1 2 1 3
2 4 3 5
3 7 2 2
4 7 4 4