一尘不染

每一张表格行创建一个json

sql

我想从表中的数据创建json。表看起来像这样:

|code  |
+------+
|D5ABX0|
|MKT536|
|WAEX44|

我正在使用FOR JSON PATH,这很不错:

SELECT [code]
FROM feature
FOR JSON PATH

但此查询的返回值是一行中的三个串联的json:

   |JSON_F52E2B61-18A1-11d1-B105-00805F49916B              |
+----------------------------------------------------------+
1  |[{"code":"D5ABX0"},{"code":"MKT536"},{"code":"WAEX44"}]|

我需要每一行都是一个单独的json,像这样:

   |JSON_return       |
+---------------------+
1  |{"code":"D5ABX0"} |
2  |{"code":"MKT536"} |
3  |{"code":"WAEX44"} |

我正在尝试使用拆分函数(CROSS
APPLY),该函数需要使用分隔符作为参数,但这不是一个可靠的解决方案,因为json可以进一步扩展或分支,并且可以不分离整个json,而是分离json内部的json

;WITH split AS (
SELECT [json] = (SELECT code FROM feature FOR JSON PATH)
)
SELECT
     T.StringElement
FROM split S
CROSS APPLY dbo.fnSplitDelimitedList([json], '},{') T

输出为:

   |StringElement     |
+---------------------+
1  |[{"code":"D5ABX0" |
2  |"code":"MKT536"   |
3  |"code":"WAEX44"}] |

有没有一种方法可以强制sqlserver每行创建一个json?


阅读 133

收藏
2021-03-08

共1个答案

一尘不染

您将需要使用as子查询来实现此目的;FOR JSON将为整个返回的数据集创建一个JSON字符串。这应该给您带来的好处:

CREATE TABLE #Sample (code varchar(6));
INSERT INTO #Sample
VALUES ('D5ABX0'),
       ('MKT536'),
       ('WAEX44');

SELECT (SELECT Code
        FROM #Sample sq
        WHERE sq.code = S.code
        FOR JSON PATH)
FROM #Sample S;
DROP TABLE #Sample;
2021-03-08