数据传输: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
我想请您帮忙。 在我们的制作中,我想传输多种数据,因此我决定为此选择使用 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 |