Sql server 使用FOR JSON子句获取多行

Sql server 使用FOR JSON子句获取多行,sql-server,sql-server-2016,Sql Server,Sql Server 2016,使用PostgreSQL,我可以拥有多行json对象 select (select ROW_TO_JSON(_) from (select c.name, c.age) as _) as jsonresult from employee as c 这给了我一个结果: {"age":65,"name":"NAME"} {"age":21,"name":"SURNAME"} 但是在SqlServer中,当我使用FORJSON AUTO子句时,它会给我一个JSON对象数组,而不是多行 select

使用PostgreSQL,我可以拥有多行json对象

select (select ROW_TO_JSON(_) from (select c.name, c.age) as _) as jsonresult from employee as c
这给了我一个结果:

{"age":65,"name":"NAME"}
{"age":21,"name":"SURNAME"}
但是在SqlServer中,当我使用FORJSON AUTO子句时,它会给我一个JSON对象数组,而不是多行

select c.name, c.age from customer c FOR JSON AUTO

[{"age":65,"name":"NAME"},{"age":21,"name":"SURNAME"}]

如何在SqlServer中获得相同的结果格式?

通过在每一行中构造单独的JSON:

SELECT (SELECT [age], [name] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)
FROM customer
还有一种替代形式不要求您了解表结构,但性能可能较差,因为它可能会生成一个大的中间JSON:

SELECT [value] FROM OPENJSON(
    (SELECT * FROM customer FOR JSON PATH)
)

没有比这更好的结构

SELECT c.id, jdata.*
FROM customer c
  cross apply 
    (SELECT * FROM customer jc where jc.id = c.id FOR JSON PATH , WITHOUT_ARRAY_WRAPPER) jdata (jdata)

@马修:是的,请看更新的问题。我不知道有哪种方法可以取得好的效果;如果这是一个问题,请另问一个问题。或者,您知道,只需写出列,选择*是出于某种原因而推荐的。添加SQL Server 2016 CTP3.2时不使用数组包装器。。。示例:选择前5名为json路径选择一个.*,而不使用sys.objects中的数组包装器。其他答案对我不适用