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

时间:2017-10-18 02:27:27

标签: sql sql-server json tsql

以下查询将整个表作为单个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字符串,但我更愿意重用现有的工具来处理值中的引号等情况。

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:0)

你可以试试这个。

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 :(得分:0)

您可以尝试以下方法:

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

答案 3 :(得分:0)

以防其他任何人迷路。 与@Waldemar相似,但不需要在相关子查询中进行自我联接:

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

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

答案 4 :(得分:0)

正如我在this article中所述,您可以将记录转换为JSON对象,如下所示:

SELECT i.*
FROM items i
WHERE i.createdAt > (SELECT i2.createdAt FROM items i2 WHERE i2.id = ?)
ORDER BY i.createdAt DESC
LIMIT 1;