OPENJSON 中的动态枢轴
Dynamic Pivot in OPENJSON
我有以下 JSON 数据。
{
"Id": "001",
"EMP_Id": 203,
"DEP_Id": 4126,
"CreatedOn": "2020-07-20T03:52:26.6918267-04:00",
"CreatedBy": "Test"
}
我需要将其转换为以下格式,但我的 JSON 值将是动态的,我不知道我将获取 Key 中的哪些列。
示例代码下方:
DECLARE @Json NVARCHAR(200)
SET @Json = '{"Id":"001","EMP_Id":203,"DEP_Id":4126,"CreatedOn":"2020-07-20T03:52:26.6918267-04:00","CreatedBy":"Test"}'
SELECT [Key], [Value] FROM OPENJSON(@Json)
请帮助我实现它。
您可以尝试动态构建 OPENJSON()
调用所需的显式模式。您需要使用默认架构执行 OPENJSON()
以获取 key
名称和数据类型:
JSON:
DECLARE @Json nvarchar(200)
SET @Json = '{"Id":"001","EMP_Id":203,"DEP_Id":4126,"CreatedOn":"2020-07-20T03:52:26.6918267-04:00","CreatedBy":"Test"}'
声明:
DECLARE @stm nvarchar(max)
-- Explict schema
SELECT @stm = STRING_AGG(CONCAT(
QUOTENAME([Key]),
CASE
WHEN [type] = 0 THEN CONCAT(N' nvarchar(200) ''$."', [key], N'"''')
WHEN [type] = 1 THEN CONCAT(N' nvarchar(200) ''$."', [key], N'"''')
WHEN [type] = 2 THEN CONCAT(N' int ''$."', [key], N'"''')
WHEN [type] = 3 THEN CONCAT(N' bit ''$."', [key], N'"''')
WHEN [type] = 4 THEN CONCAT(N' nvarchar(max) ''$."' , [key], N'"'' AS JSON')
WHEN [type] = 5 THEN CONCAT(N' nvarchar(max) ''$."', [key], N'"'' AS JSON')
END
), N',')
FROM OPENJSON(@Json)
-- Execute statement
SET @stm = CONCAT(N'SELECT * FROM OPENJSON(@json) WITH (', @stm, N')')
EXEC sp_executesql @stm, N'@json nvarchar(200)', @json
结果:
Id EMP_Id DEP_Id CreatedOn CreatedBy
---------------------------------------------------------------
001 203 4126 2020-07-20T03:52:26.6918267-04:00 Test
我有以下 JSON 数据。
{
"Id": "001",
"EMP_Id": 203,
"DEP_Id": 4126,
"CreatedOn": "2020-07-20T03:52:26.6918267-04:00",
"CreatedBy": "Test"
}
我需要将其转换为以下格式,但我的 JSON 值将是动态的,我不知道我将获取 Key 中的哪些列。
示例代码下方:
DECLARE @Json NVARCHAR(200)
SET @Json = '{"Id":"001","EMP_Id":203,"DEP_Id":4126,"CreatedOn":"2020-07-20T03:52:26.6918267-04:00","CreatedBy":"Test"}'
SELECT [Key], [Value] FROM OPENJSON(@Json)
请帮助我实现它。
您可以尝试动态构建 OPENJSON()
调用所需的显式模式。您需要使用默认架构执行 OPENJSON()
以获取 key
名称和数据类型:
JSON:
DECLARE @Json nvarchar(200)
SET @Json = '{"Id":"001","EMP_Id":203,"DEP_Id":4126,"CreatedOn":"2020-07-20T03:52:26.6918267-04:00","CreatedBy":"Test"}'
声明:
DECLARE @stm nvarchar(max)
-- Explict schema
SELECT @stm = STRING_AGG(CONCAT(
QUOTENAME([Key]),
CASE
WHEN [type] = 0 THEN CONCAT(N' nvarchar(200) ''$."', [key], N'"''')
WHEN [type] = 1 THEN CONCAT(N' nvarchar(200) ''$."', [key], N'"''')
WHEN [type] = 2 THEN CONCAT(N' int ''$."', [key], N'"''')
WHEN [type] = 3 THEN CONCAT(N' bit ''$."', [key], N'"''')
WHEN [type] = 4 THEN CONCAT(N' nvarchar(max) ''$."' , [key], N'"'' AS JSON')
WHEN [type] = 5 THEN CONCAT(N' nvarchar(max) ''$."', [key], N'"'' AS JSON')
END
), N',')
FROM OPENJSON(@Json)
-- Execute statement
SET @stm = CONCAT(N'SELECT * FROM OPENJSON(@json) WITH (', @stm, N')')
EXEC sp_executesql @stm, N'@json nvarchar(200)', @json
结果:
Id EMP_Id DEP_Id CreatedOn CreatedBy
---------------------------------------------------------------
001 203 4126 2020-07-20T03:52:26.6918267-04:00 Test