从SQL 2016查询返回键和JSON字符串

从SQL 2016查询返回键和JSON字符串,sql,sql-server,json,tsql,sql-server-2016,Sql,Sql Server,Json,Tsql,Sql Server 2016,使用SQL 2016 JSON内置函数 表:用户 列(ID int、FirstName varchar(50)、LastName varchar(50) 资料 3009艾米丽礼仪 3010乔安妮·埃尔南德斯 3011凯利克莱纳 3012亚历克西斯·弗雷德里克 3013饮食单体 3018艾希礼·伊利 3021 Jeralynn Campbell Triplett 3026劳伦·辛纳曼 3027克里斯托弗·科雷亚 3028斯蒂芬妮·蒙塔沃克鲁兹 所需结果->临时表 ID JSON_D

使用SQL 2016 JSON内置函数

表:用户 列(ID int、FirstName varchar(50)、LastName varchar(50)

资料

3009艾米丽礼仪
3010乔安妮·埃尔南德斯
3011凯利克莱纳
3012亚历克西斯·弗雷德里克
3013饮食单体
3018艾希礼·伊利
3021 Jeralynn Campbell Triplett
3026劳伦·辛纳曼
3027克里斯托弗·科雷亚
3028斯蒂芬妮·蒙塔沃克鲁兹

所需结果->临时表

ID       JSON_DATA        
3009    {"ID":3009,"FirstName":"Emily","LastName":"Manners"}
3010    {"ID":3010,"FirstName":"Joanne","LastName":"Hernandez"}
正在尝试使用:

SELECT
    [ID],
    [FirstName],
    [LastName]
FROM Emp
FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER

在十字架的帮助下申请

Declare @Emp table (ID int,FirstName varchar(50),LastName varchar(50))
Insert into @Emp values
(3009,'Emily' ,'Manners'),
(3010,'Joanne','Hernandez'),
(3011,'Kelly' ,'Kleiner')

Select A.ID
      ,B.JSON_Data
 From @Emp A
 Cross Apply (
               Select JSON_Data = (Select A.ID,A.FirstName,A.LastName FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)
             ) B
返回

ID      JSON_Data
3009    {"ID":3009,"FirstName":"Emily","LastName":"Manners"}
3010    {"ID":3010,"FirstName":"Joanne","LastName":"Hernandez"}
3011    {"ID":3011,"FirstName":"Kelly","LastName":"Kleiner"}

在某些情况下,此表单可能比使用交叉应用更具可读性。
在我尝试过的情况下,执行计划总是相同的,但在任何给定的情况下,其中一个可能比另一个执行得更好

Declare @Emp table (ID int,FirstName varchar(50),LastName varchar(50))
Insert into @Emp values
(3009,'Emily' ,'Manners'),
(3010,'Joanne','Hernandez'),
(3011,'Kelly' ,'Kleiner')

Select A.ID
      ,(Select A.ID,A.FirstName,A.LastName 
           FOR JSON PATH, INCLUDE_NULL_VALUES, 
           WITHOUT_ARRAY_WRAPPER) AS JSON_Data
 From @Emp A
嗨,约翰