SQL Server 2012大幅增强了T-SQL

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

SQL Server 2012对T-SQL进行了大幅增强,其中包括支持ANSI FIRST_VALUE和LAST_VALUE函数,支持使用FETCH与OFFSET进行声明式数据分页,以及支持.NET中的解析与格式化函数。

  Fetch与Offset

  目前,对于实现服务端分页,SQL Server开发人员倾向于选择使用命令式技术,如将结果集加载入临时表,对行进行编号,然后从中挑选感兴趣的范围。有一些开发人员选择使用更加时髦的ROW_NUMBER和OVER模式。另外,还有一些开发人员坚持使用游标。虽然这些技术都不是太难,但是它们可能会较为耗时并且容易出错。不仅如此,由于每个开发人员都有自己中意的实现方式,从而造成这些技术并不一致。

  SQL Server 2012通过增加声明式数据分页解决了该问题。开发人员可以通过在T-SQL的ORDER BY子句后加上OFFSET和FETCH NEXT选项来完成数据分页。目前SQL Server并没有为其做性能优化,而只是帮助完成用户需要手工完成的工作。正如Greg Low博士在演示中所说,只有当用户知道你试图解决的问题是什么,而不是知道你怎样去解决问题的时候,他们才可以更好地编写出查询优化来对性能进行改善。

  Over子句窗口

  有时候开发人员需要基于行之间的差异来编写查询。例如,你可能有兴趣想知道处理当前行与上一行之间所花去的时间。使用游标很容易解决该问题,但由于其风格和性能原因,大家并不怎么使用。你还可以使用子查询进行逐行执行,但这样的代价实在太过昂贵。最后,你还可以将问题推给客户端,但这需要客户端是一门编程语言而不只是一个报表工具方能起效。

  现在你可以使用LAG函数直接访问上一行。由于用户显式声明了试图完成的工作,因此查询分析器会在内存中保留上一行,而不再需要创建一个子查询,这反过来也极大地提升了性能。虽然LAG默认为上一行,但是如果你需要进一步回溯,可以在其中指定偏移量。

  LAG与它的姊妹函数LEAD均为ANSI标准的一部分。该特性自从微软在SQL Server 2005中部分实现OVER子句时,就一直被开发人员要求加入。

  这一版本还支持了FIRST_VALUE和LAST_VALUE。

  反射

  先前开发人员若想要确定查询或存储过程的返回结果类型,需要使用SET FMTONLY命令。使用该命令可以在不需要实际执行查询的情况下预览返回结果的列信息。可惜的是,返回的信息仅仅局限于列的定义,而如果只要先前执行查询便能够获得这些信息。

  通过使用新的sp_describe_first_result_set存储过程,开发人员可以获得查询和存储过程返回结果的详细信息。这些信息包括数据类型及其规模、源表/列,列是否可被更新或由计算而得,以及其他大量信息。动态管理视图sys.dm_exec_describe_first_result和sys.dm_exec_describe_first_result_set_for_object同样具有该特性。

  防御式编程(Defensive Coding)

  开发人员在调用同事编写的存储过程时通常很头疼,这是因为存储过程返回结果在编译期没有保证,因此意外的破坏性改动成了一大顾虑。尽管T-SQL没有提供任何手段来预防这些错误,但是可以借助RESULT SETS选项将错误发生率降至最低。

  开发人员可以通过指定RESULT SETS选项要求存储过程返回特定的数据结构。如果存储过程返回的结果集与被要求的有出入,将会发生错误并导致批次中止。由于发生的错误是运行时错误,因此我们建议使用该选项的开发人员创建完整系列的单元测试,以确保代码在接触生成环境前可以触发该错误。

  错误处理

  T-SQL从2005年就开始支持TRY-CATCH ,但奇怪的是,直到现在才有了THROW。THROW不带参数,它的用法与C#和VB中catch块中的throw类似。也就是说,它会重新抛出异常,而不会丢失当时捕捉到的任何信息。它对于向重试队列记录或添加条目很有帮助,同时也可以通知应用程序出错。

  当THROW带参使用时,它类似于RAISERROR,不同之处在于它支持sys.messages之外的错误信息号(error number),并且它的严重级别(severity)总是16。还有一点与RAISEERROR不同的是,所有未被捕获的THROW错误总是批量终止。

  解析和转换

  T-SQL目前支持PARSE函数,该函数包含选项用于指定区域性设置(Culture)。区域性设置是.NET框架支持的诸多特性之一,用于表明解析如何实现,TRY_PARSE函数也包含该选项。

  类似的,还有一个新的TRY_CONVERT函数。这两者以及try parse函数在转换失败后会返回null。

  另一方面,FORMAT函数采用了.NET格式化设置。尽管与本地函数(如STR)相比它的速度稍慢,但是却更加灵活。

  日期/时间函数

  虽然T-SQL仍然远没达到完美,但至少日期/事件函数处理上有了些许改善。EOMONTH函数用于返回月份的最后一天,这对报表是一个非常有用的特性。xxxFROMPARTS系列函数使用一系列参数而不是单个字符串来构造日期和时间。它包含了对数据类型Date、DateTime、DateTime2、DateTimeOffset、SmallDate以及Time的支持。

  混合函数(Misc. Function)

  T-SQL包含了Access和Visual Basic中Choose的函数。在某些情况下,它可以被当成一个简化版的CASE使用。另外一个从这些语言中借鉴的函数是IIF。

  CONCAT可用于字符串拼接。它除了可以让代码更容易地移植到其他数据库语言中,还提供了与+运算符不一样的null处理方式。Itzik Ben-Gan写道:

  > 连接运算符+在输入为NULL时会产生结果NULL。而CONCAT函数在转换前将NULL输入转换为空字符串。 当然,你可以使用COLAESCE函数替换NULL输入为空字符来完成同样的工作,不过这样做代码会让代码显得混乱。








本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/817452,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
15天前
|
SQL 数据可视化 算法
SQL Server聚类数据挖掘信用卡客户可视化分析
SQL Server聚类数据挖掘信用卡客户可视化分析
|
3天前
|
SQL 存储 数据库连接
LabVIEW与SQL Server 2919 Express通讯
LabVIEW与SQL Server 2919 Express通讯
|
4天前
|
SQL Windows
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
13 4
|
5天前
|
SQL 数据可视化 Oracle
这篇文章教会你:从 SQL Server 移植到 DM(上)
这篇文章教会你:从 SQL Server 移植到 DM(上)
|
5天前
|
SQL 关系型数据库 数据库
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
|
5天前
|
SQL 存储 网络协议
SQL Server详细使用教程
SQL Server详细使用教程
26 2
|
5天前
|
SQL 存储 数据库连接
C#SQL Server数据库基本操作(增、删、改、查)
C#SQL Server数据库基本操作(增、删、改、查)
7 0
|
5天前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
6天前
|
SQL 存储 关系型数据库
SQL Server详细使用教程及常见问题解决
SQL Server详细使用教程及常见问题解决
|
7天前
|
SQL 安全 数据库
SQL Server 备份和还原
SQL Server 备份和还原