为每一表行创建一个 json

问题描述 投票:0回答:2

我想从表中的数据创建 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?

sql json sql-server
2个回答
17
投票

您需要使用 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;

-1
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.