在Sql Server 2016中使用For Json子句把数据作为json格式导出

原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/export-query-result-as-json-format-in-sql-server-2016/

使用for json子句把查询结果作为json字符串导出,将作为sql server 2016中首先可用的一个特性。如果你熟悉for xml子句,那么将很容易理解for json:

select ccolumn, expression, column as alias
    from table1, table2, table3
    for json [auto | path]

如果你把for json子句添加到T-SQL Select查询语句的最后,SQL Server将会把结果格式化为JSON字符串之后在返回到客户端。每一行数据将会格式化为一个json对象,每一个数据字段将会成为行对象的值,列名或者列的别名会作为行对象的键。我们有两种类型的for json子句:

  • FOR JSON Path,通过列名或者列别名来定义JSON对象的层次结构,列别名中可以包含“.”,JSON的成员层次结构将会与别名中的层次结构保持一致。
    这个特性非常类似于早期SQL Server版本中的For Xml Path子句,可以使用斜线来定义xml的层次结构。
  • FOR JSON Auto,自动按照查询语句中使用的表结构来创建嵌套的JSON子数组,类似于For Xml Auto特性。

如果你用过PostgreSQL中涉及到JSON的函数和操作符,你会注意到,FOR JSON子句类等价于PostgreSQL中的JSON创建函数比如row_to_json或json_object。FOR JSON子句的主要目的是根据JSON规范把变量、列格式化为JSON对象。比如:

set @json = (select 1 as firstKey, getdate() as dateKey, @someVar as thirdKey for json path)
-- result is : {"firstKey": 1, "dateKey": "2016-06-15 11:35:21", "thirdKey": "Content of variable"}

FOR JSON子句主要应用场景:

    • 把需要返回给客户端的一组对象序列化为JSON。想象一下,在你创建JSON Web服务的时候,需要提供供应商信息及其产品信息(比如在OData服务中使用$extend选项)。你可能会查询供应商列表,把每个供应商信息格式化为JSON对象并通过额外查询来获得这个供应商的产品列表,将其转化为JSON对象数组附加到供应商对象。其他方案可能会通过链接查询来获得供应商和产品信息列表,使用客户端代码来格式化为JSON对象(若使用Entity Framework将可能产生额外查询)。使用for json子句,你可以连接这两个表进行查询,添加你想要的前缀(定义JSON层次结构),在数据库层完成JSON格式化工作。
    • 在一对多的父子表关系场景,你不想创建子表,而是想把子表的记录以JSON数组的格式存储作为父表的一列。比如你不想把SalesOrderHeader和SalesOrderDetails数据分成两个表来保存,你可以把每个订单的多个商品详情格式化为JSON数组保存到SalesOrderHeader表中的一列。
时间: 2024-08-24 17:05:24

在Sql Server 2016中使用For Json子句把数据作为json格式导出的相关文章

Sql Server 2016中增加了对JSON的内置支持

原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/built-in-json-support-in-sql-server-2016/ 在数据库层对JSON提供支持,是请求排名最靠前的特性之一,在Microsoft Connect网站上对他的投票量超过了1000.微软承诺,在Sql Server 2016版本中,会提供内置的JSON支持.注意这并不是Sql Server 2005已有特性XML原生支持的翻版.微软的目标是创

SQL Server 2016中In-Memory OLTP继CTP3之后的新改进

SQL Server 2016中In-Memory OLTP继CTP3之后的新改进 转译自:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/03/25/whats-new-for-in-memory-oltp-in-sql-server-2016-since-ctp3/ SQL Server 2016正在对 In-Memory OLTP 功能作一系列的强化,从而使该功能使用起来更加方便,性能更优.在之前的文章中,我已经对S

SQL Server 2016 ->> T-SQL新特性

1) TRUNCATE表分区而不是整表 CREATE TABLE dbo.TruncatePartitionTest ( PrtCol INT, Col2 NVARCHAR(300) ) ON [myPS1](PrtCol) GO INSERT dbo.TruncatePartitionTest VALUES(1,'AAA'), (11,'AAA'), (100,'AAA'), (101,'AAA') GO -- TRUNCATE partitions 1 to 2 TRUNCATE TABLE

SQL Server 2016 —— 聚集列存储索引的功能增强

作者 Jonathan Allen,译者         邵思华         发布于     2015年6月14日 聚集列存储索引(CC Index)是SQL Server 2014中两大最引人瞩目的特性之一,设计为用于超过1千万条记录的数据表.使用者无需明确的指定索引,也能够保证分析式查询的优良性能. 但2014版本中的这一特性存在着一个缺陷,即使用者无法指定索引.虽然CC索引比起传统表的表扫描要快得多,但它还是及不上经手动调整的覆盖索引.因此,为了同时支持这两种模式,开发者不得不创建两张

SQL Server 2016五大优势挖掘企业用户数据价值

转载自:http://soft.zdnet.com.cn/software_zone/2016/0318/3074442.shtml 3月10日,微软公司在美国纽约举办了一场名为“Data Driven”的活动,正式发布了新一代SQL Server 2016, 与此同时,还附赠了两条爆炸性消息:微软将SQL Server 2016开放给linux,同时还发布了一款针对Oracle数据库的迁移工具,以及相关的迁移优惠政策. 业内对这两条消息进行了各种各样的猜想和推测. 一周后,SQL Server

我才发现SQL Server 2016 RC1 已经发布

SQL Server 2016 RC1 已经正式发布,该版本是近年来微软在数据库平台方向的一次重大革新.SQL Server 2016 中包含了实时运营分析能力.移动设备上的丰富可视化.内置高级分析.新的高级安全技术和新的混合云方案. SQL Server 2016 利用内置的 In-memory 性能和运营分析提供突破性的关键任务功能.全面的安全功能(比如新的 Always Encrypted 技术)可帮助保护企业数据(无论是静止还是移动),而一流的高可用性和灾难恢复解决方案为 AlwaysO

浅析SQL Server数据库中的伪列以及伪列的含义

SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个常识,对此不作具体详细阐述.这里主要是提到的RowId引起了一点思考.那么,这个RowId是个什么玩意?能不能更加直观一点来看看RowId的信息?代表什么含义?这个当然也是可以的.Oracle中的表中有一个伪列的概念,就是在查询表的时候加上select rowid,* from Table,会查询出

SQL Server 2016 JSON原生支持实例说明

原文:SQL Server 2016 JSON原生支持实例说明 背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些大数据很数据接口的解析环节来说这显得非常有价值.与我们现在所做比如在SQL中使用CLR或者自定义的函数来解析JSON相比较,新的内置JSON会大大提高性能,同时优化了编程以及增删查改等方法. 那么是否意味着我们可以丢弃XML,然后开始使

关于SQL Server 2017中使用json传参时解析遇到的多层解析问题

原文:关于SQL Server 2017中使用json传参时解析遇到的多层解析问题 开发新的系统,DB部分使用了SQL Server从2016版开始自带的Json解析方式. 用了快半年,在个人项目,以及公司部分项目上使用了,暂时还没遇到大的问题,和性能问题. 今天在解析Json的多级参数遇到了点小问题,在此记录一下: 传参内容如下: 1 declare @json varchar(max)=N'{"Customer":36,"Positions":[{"I