【发布时间】:2019-12-29 01:16:00
【问题描述】:
我将 JSON 以以下格式存储在 SQL Server 数据库表中。我已经能够捏造一种方法来获得我需要的值,但我觉得必须有更好的方法来使用 T-SQL 来做到这一点。 JSON 从以下格式的报告中输出,其中“列”中的列名对应于“行”-“数据”数组值。
所以“财政月份”列对应数据值“11”,“财政年度”对应“2019”等。
{
"report": "Property ETL",
"id": 2648,
"columns": [
{
"name": "Fiscal Month",
"dataType": "int"
},
{
"name": "Fiscal Year",
"dataType": "int"
},
{
"name": "Portfolio",
"dataType": "varchar(50)"
},
{
"name": "Rent",
"dataType": "int"
}
],
"rows": [
{
"rowName": "1",
"type": "Detail",
"data": [
11,
2019,
"West Group",
10
]
},
{
"rowName": "2",
"type": "Detail",
"data": [
11,
2019,
"East Group",
10
]
},
{
"rowName": "3",
"type": "Detail",
"data": [
11,
2019,
"East Group",
10
]
},
{
"rowName": "Totals: ",
"type": "Total",
"data": [
null,
null,
null,
30
]
}
]
}
为了获取“数据”数组中的数据,我目前在 T-SQL 中有一个 2 步过程,在该过程中我创建了一个临时表,并在此处插入“$.Rows”中的行键/值。然后我可以为每一行选择单独的列
CREATE TABLE #TempData
(
Id INT,
JsonData VARCHAR(MAX)
)
DECLARE @json VARCHAR(MAX);
DECLARE @LineageKey INT;
SET @json = (SELECT JsonString FROM Stage.Report);
SET @LineageKey = (SELECT LineageKey FROM Stage.Report);
INSERT INTO #TempData(Id, JsonData)
(SELECT [key], value FROM OPENJSON(@json, '$.rows'))
MERGE [dbo].[DestinationTable] TARGET
USING
(
SELECT
JSON_VALUE(JsonData, '$.data[0]') AS FiscalMonth,
JSON_VALUE(JsonData, '$.data[1]') AS FiscalYear,
JSON_VALUE(JsonData, '$.data[2]') AS Portfolio,
JSON_VALUE(JsonData, '$.data[3]') AS Rent
FROM #TempData
WHERE JSON_VALUE(JsonData, '$.data[0]') is not null
) AS SOURCE
...
etc., etc.
这可行,但我想知道是否有一种方法可以直接选择数据值,而无需将其放入临时表的中间步骤。我阅读的文档和示例似乎都要求数据具有与之关联的名称才能访问它。当我尝试通过索引直接访问某个位置的数据时,我得到的是 Null。
【问题讨论】:
标签: json sql-server tsql sql-server-2016