【问题标题】:How to convert rows to JSON in TSQL select query?如何在 SQL 选择查询中将行转换为 JSON?
【发布时间】:2021-01-09 00:22:05
【问题描述】:

以下查询将整个表作为单个 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 Server 2016 吗?

标签: sql sql-server json tsql


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 特别感谢您提供 WITHOUT_ARRAY_WRAPPER 选项!
【解决方案3】:

你可以试试这个。

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

【讨论】:

    【解决方案4】:

    你可以试试这个:

    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
    

    【讨论】:

      【解决方案5】:

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

      SELECT * 
      FROM MyTable  
      FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
      

      【讨论】:

      • 它是关于每一行没有所有结果。
      猜你喜欢
      • 2016-05-13
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2020-01-19
      相关资源
      最近更新 更多