使用 STUFF 函数用嵌套对象形成 json

Forming json with nested objects using STUFF function

如何在 tsql 过程中将相关表查询到 json? 我正在尝试使用 STUFF 函数。 我需要输出这样的 json:

{
  "Id": "4E7ECBE6-3EF6-4F14-B117-C39FCAC00DD5",
  "tasks": [
  {
      "taskOrders": [
        {
          "merchantId": "EFEDE945-3A17-487B-919B-406C9DA8B8A9",
          "merchantOrderNumber": "1129"
        }
      ],
      "totalWeight": 3,
      "state": 1
    }
  ]
}

我正在尝试将此类查询用于“任务”部分,并将其与上部字段连接:

select '"tasks":[' + STUFF((
        select ',{
          "taskOrders": [
            '+STUFF((
                select ',{
                      "merchantId": "' + cast(o.merchantId as nvarchar(max)) + '",
                      "merchantOrderNumber": "' + cast(o.orderNumber as nvarchar(max)) + '"
                    }'
                from dbo.Order o
                where o.orderNumber = chk.orderNumber
                for xml path(''), type
            ).value('.', 'varchar(max)'), 1, 1, '')+'
          ],
          "totalWeight": ' + cast(chk.weight as nvarchar(max)) + ',
          "state": ' + cast(chk.state as nvarchar(max)) + '"
        }'
        from dbo.Checkpoints as chk
        for xml path(''), type
    ).value('.', 'varchar(max)'), 1, 1, '') + ']'

我想我做错了什么,因为输出看起来像这样:

"tasks":[{
"taskOrders": [     {
"merchantId": "EFEDE945-3A17-487B-919B-406C9DA8B8A9",
"merchantOrderNumber": "111"
 }
],
"totalWeight": 1,
"state": 1
 }
],
"totalWeight": 1,
"state": 1
}]

我应该使用游标还是可以通过 STUFF 来完成?

SQL Server 2016 及更高版本 built-in support for JSON。不要在这里使用 STUFFFOR XML,而是尝试使用 FOR JSON PATH,例如:

/*
 * Example data...
 */
create table dbo.[Order] (
  merchantId uniqueidentifier,
  orderNumber varchar(10)
);
insert dbo.[Order] (merchantId, orderNumber) values
  ('EFEDE945-3A17-487B-919B-406C9DA8B8A9', '1129'),
  ('d79ce36c-5721-414b-a050-0a9105defe67', '1129');
  
create table dbo.Checkpoints (
  Id uniqueidentifier,
  orderNumber varchar(10),
  state int,
  weight int
);
insert dbo.Checkpoints (Id, orderNumber, state, weight) values
  ('4E7ECBE6-3EF6-4F14-B117-C39FCAC00DD5', '1129', 1, 1);

/*
 * Example query..
 */
select
  chk.Id,
  json_query((
    select
      o.merchantId,
      o.orderNumber as merchantOrderNumber
    from dbo.[Order] o
    where o.orderNumber = chk.orderNumber
    for json path
  ), '$') as tasks,
  weight as totalWeight,
  state
from dbo.Checkpoints chk
for json path, without_array_wrapper;

产生输出:

{
    "Id": "4E7ECBE6-3EF6-4F14-B117-C39FCAC00DD5",
    "tasks": [
        {
            "merchantId": "EFEDE945-3A17-487B-919B-406C9DA8B8A9",
            "merchantOrderNumber": "1129"
        },
        {
            "merchantId": "D79CE36C-5721-414B-A050-0A9105DEFE67",
            "merchantOrderNumber": "1129"
        }
    ],
    "totalWeight": 1,
    "state": 1
}