SQL Server通过批处理将数据转换为JSON

e4eetjau  于 2023-01-10  发布在  SQL Server
关注(0)|答案(1)|浏览(144)

我希望将数据转换成JSON,每批数据中不能有两个以上的用户,不能有空值。

create table #test(userid int, status_a int, status_b int)

insert into #test values  (135, 11,23),
                          (197, 14, null),
                          (254, null,21),
                          (261, 13, 25),
                          (391, null, 17)

结果应该是

[
   {
      "TrackingData":[
         {
            "userid":135,
            "status_a":11,
            "status_b":23
         },
         {
            "userid":197,
            "status_a":14
         }
      ]
   },
   {
      "TrackingData":[
         {
            "userid":254,
            "status_b":21
         },
         {
            "userid":261,
            "status_a":13,
            "status_b":25
         }
      ]
   },
   {
      "TrackingData":[
         {
            "userid":391,
            "status_b":17
         }
      ]
   }
]

我试过这样做,但不知道如何分批次

SELECT *
FROM #test
FOR JSON PATH
toe95027

toe950271#

看起来您是按userid排序的,并且您希望前两对放在TrackingData对象中,下一对放在TrackingData对象中,依此类推。
这个

DECLARE @BatchSize INT = 2;

WITH T AS
(
SELECT *, 
       RN = ROW_NUMBER() OVER (ORDER BY userid) - 1,
       Json = (SELECT t.* FOR JSON PATH, WITHOUT_ARRAY_WRAPPER )
FROM #test t
)
SELECT TrackingData = JSON_QUERY('[' + 
                                  STRING_AGG(Json, ',') WITHIN GROUP (ORDER BY RN) + 
                                  ']')
FROM T
GROUP BY RN/@BatchSize
ORDER BY RN/@BatchSize
FOR JSON PATH

它生成基于零的连续行编号,并使用整数除法将其划分为<@BatchSize>大小的组。
| 用户识别码|状态_a|状态_B|注册护士|RN/@批量|约松|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 一百三十五|十一|二十三|无|无|{“用户ID”:135,“状态a”:11,“状态B”:23}|
| 一百九十七|十四|零|1个|无|{“用户标识”:197,“状态_a”:14}|
| 二百五十四|零|二十一|第二章|1个|{“用户ID”:254,“状态B”:21}|
| 二六一|十三|二十五|三个|1个|{“用户标识”:261,“状态a”:13,“状态B”:25}|
| 三九一|零|十七|四个|第二章|{“用户标识”:391,“状态B”:17}|
子数组的构造是通过字符串聚合完成的,并 Package 在JSON_QUERY中,因此它被视为JSON,而不会在最终的FOR JSON PATH中转义。

相关问题