我想从表中的数据创建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?
您将需要使用as子查询来实现此目的;FOR JSON将为整个返回的数据集创建一个JSON字符串。这应该给您带来的好处:
FOR 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;