??
我想請你幫忙。在我們的生產中,我想傳輸多種資料,我決定為此選擇使用 JSON。我已經在應用程式一側創建了包含所有資料的 JSON 字串,現在我需要使用存盤程序將其存盤到我的資料庫中。一切都很好,但在某些情況下我遇到了一個小問題。
要求
我需要知道應該將多少缺陷件發送到某個流程(需要知道:哪個流程,什么缺陷以及多少......)??
很抱歉這個混亂的描述,但下面是一個例子
這是我需要轉換的 JSON 部分:
{"production":{"repairs":{"2":{"1":3},"4":{"3":5},"7":{"2":2,"4":4}}}}
這是所需的輸出:
| 行號 | 行程ID | 錯誤ID | 數量 |
|---|---|---|---|
| 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中使用路徑字串的連接處回傳語法錯誤. (即使它在經典的“查詢模式”下運行良好...... ??)
錯誤訊息(僅在存盤程序中):
SQL Error [102] [S0001]: Incorrect syntax near ' '.
即使我不使用連接并使用整個路徑字串作為引數,也會發生錯誤...似乎存盤程序中的函式 OPENJSON 只需要路徑字串中的絕對值''...
我的請求:
伙計們,我想問你是否有人知道如何以更好的方式解決它(甚至可能沒有 WHILE 回圈?)......
非常感謝。??
uj5u.com熱心網友回復:
我認為你需要這個:
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
結果:
| 行 ID | 行程ID | 錯誤ID | 數量 |
|---|---|---|---|
| 1 | 2 | 1 | 3 |
| 2 | 4 | 3 | 5 |
| 3 | 7 | 2 | 2 |
| 4 | 7 | 4 | 4 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476286.html
下一篇:如何獲得客戶購買的第二條記錄?
