如何在TSQL选择查询中将行转换为JSON?

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

以下查询将整个表返回为单个 JSON 字符串(JSON 对象列表 - 每行一个):

SELECT * FROM MyTable FOR JSON AUTO 

我需要返回多行,其中每行都是表中单行的 JSON 字符串。

例如,如果表字段为 A、B、C,输出应为:

{A: <value>, B: <value>, C: <value>}
{A: <value>, B: <value>, C: <value>}
{A: <value>, B: <value>, C: <value>}
...
{A: <value>, B: <value>, C: <value>}

如何在 TSQL 中执行此操作?

虽然可以通过连接字符串来手动构造 JSON 字符串,但我更愿意重用现有的工具来处理值中的引号等情况。

sql sql-server json t-sql
6个回答
31
投票

这将从 select 语句中按行返回 json 数据。

DECLARE @json NVARCHAR(Max)
SET @json = (SELECT * FROM [Sales].[Customers] FOR JSON PATH, ROOT('data'))
SELECT value
FROM OPENJSON(@json,'$.data');

10
投票

以防其他人偶然发现这一点。 与@Waldemar类似,但不需要在相关子查询中进行自连接:

SELECT (SELECT A, B, C FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)
FROM MyTable

A、B 和 C 列来自 FROM 中的“MyTable”,而不需要第二个引用和隐式自连接。


3
投票

您可以将记录转换为 JSON 对象,如下所示:

SELECT * 
FROM MyTable  
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

2
投票

你可以试试这个。

SELECT JTBL.* FROM MyTable A
CROSS APPLY ( select A, B, C from MyTable B WHERE B.ID = A.ID FOR JSON AUTO ) JTBL (JSTXT)

2
投票

你可以试试这个:

SELECT (
  SELECT ID, A, B, C, D
  FROM MyTable t1
  WHERE t1.ID = t2.ID
  FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) AS column_name
FROM MyTable t2

0
投票
SELECT JSON.VALUE
FROM MyTable SRC
CROSS APPLY
(
 SELECT(  SELECT SRC.* FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
  ) VALUE
) AS JSON
© www.soinside.com 2019 - 2024. All rights reserved.