我想从表中的数据创建 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。 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 字符串。这应该可以满足您的需求:
CREATE TABLE #Sample (code varchar(6));
INSERT INTO #Sample
VALUES ('D5ABX0'),
('MKT536'),
('WAEX44');
SELECT (SELECT Code
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)
FROM #Sample S;
DROP TABLE #Sample;
CREATE TABLE #Temp
(
ID INT IDENTITY(1, 1) ,
StringValue NVARCHAR(100)
);
INSERT INTO #Temp
( StringValue )
VALUES ( N'D5ABX0' -- StringValue - nvarchar(100)
),
( 'MKT536' ),
( 'WAEX44' );
SELECT ID,'[{"code:":'''''+StringValue+'''''}]' AS JSON_return FROM #Temp
DROP TABLE #Temp