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