我在 SQL Azure 数据库实例中有一个存储过程,输入参数是一个格式如下的 JSON 字符串:
{
"OrderNumber":["OD12034"],
"Site":["New York"],
"LineNumber":[1000,2000],
"ItemNumber":["BX12345","BX12349"],
"Quantity":[23,15]
}
我想对此进行解析,以便可以将记录插入到这样的表中:
ArrayKey | ArrayElement
------------|-----------
OrderNumber | OD12034
Site | New York
LineNumber | 1000
LineNumber | 2000
ItemNumber | BX12345
ItemNumber | BX12349
Quantity | 23
Quantity | 15
到目前为止,我已经能够从 JSON 中获取数据,但不是我想要的格式。这是一个简单的例子。
SELECT * FROM OPENJSON(@JsonParameter)
key |value |type
-----------------|---------------------------|----
OrderNumber |["OD12034"] |4
Site |["New York"] |4
LineNumber |[1000,2000] |4
ItemNumber |["BX12345","BX12349"] |4
Quantity |[23,15] |4
这是另一个(与简单化相反)的例子。
SELECT
[ON].OrderNumber
, [S].Site
, [LN].LineNumber
, [IN].ItemNumber
, [Q].Quantity
FROM OPENJSON(@JsonParameter)
WITH (
[OrderNumber] NVARCHAR(MAX) '$.OrderNumber' AS JSON
,[Site] NVARCHAR(MAX) '$.Site' AS JSON
,[LineNumber] NVARCHAR(MAX) '$.LineNumber' AS JSON
,[ItemNumber] NVARCHAR(MAX) '$.ItemNumber' AS JSON
,[Quantity] NVARCHAR(MAX) '$.Quantity' AS JSON
) AS jsonValues
CROSS APPLY OPENJSON(jsonValues.OrderNumber)
WITH (OrderNumber NVARCHAR(25) '$') AS [ON]
CROSS APPLY OPENJSON(jsonValues.Site)
WITH (Site NVARCHAR(25) '$') AS [S]
CROSS APPLY OPENJSON(jsonValues.LineNumber)
WITH (LineNumber INT '$') AS [LN]
CROSS APPLY OPENJSON(jsonValues.ItemNumber)
WITH (ItemNumber NVARCHAR(31) '$') AS [IN]
CROSS APPLY OPENJSON(jsonValues.Quantity)
WITH (Quantity INT '$') AS [Q]
OrderNumber |Site |LineNumber |ItemNumber |Quantity
-------------|------------|-----------|--------------|-----------
OD12034 |New York |1000 |BX12345 |23
OD12034 |New York |1000 |BX12345 |15
OD12034 |New York |1000 |BX12349 |23
OD12034 |New York |1000 |BX12349 |15
OD12034 |New York |2000 |BX12345 |23
OD12034 |New York |2000 |BX12345 |15
OD12034 |New York |2000 |BX12349 |23
OD12034 |New York |2000 |BX12349 |15
有没有办法通过在 Azure SQL DB 中使用 JSON 工具来为每个数组元素获取一行?
好吧,我想出了一个答案,它给了我想要的结果,但它看起来很糟糕,我认为它效率低下。生成的计划的估计子树成本为 976507。这是查询。
这是结果。