如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

SQL Server 2012 大幅增强了 T-SQL

  • 2012-03-22
  • 本文字数:2204 字

    阅读完需:约 7 分钟

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 输入为空字符来完成同样的工作,不过这样做代码会让代码显得混乱。

查看英文原文: T-SQL Improvements in SQL Server 2012

2012-03-22 12:052879
用户头像

发布了 125 篇内容, 共 43.3 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

从0到1:基于微信小程序的瑜伽馆预约平台的开发笔记

CC同学

Linux之ab命令

入门小站

Linux

龙智荣誉 | 一封来自客户的感谢信

龙智—DevSecOps解决方案

感谢信

郑州等保测评公司有哪些?在哪里?

行云管家

网络安全 等保 等保测评 等保2.0 郑州

网站被DDOS攻击了怎么办?

源字节1号

开源 前端开发 后端开发

档案管理系统平台:助力实现档案管理现代化

小炮

【模块五】设计微博系统中”微博评论“的高性能高可用计算架构

yhjhero

架构 #架构训练营

Trace大盘点

奋飞安全

全球案例 | Hubspot 通过 Confluence 打造透明的协作文化,使之成为让无数人骄傲的企业

龙智—DevSecOps解决方案

Jira Atlassian Atlassian Confluence 协同办公软件 协同软件

python Excel数据表格转为HTML网页数据表格,阿里快手拼多多等7家大厂Python面试真题

程序媛可鸥

Python 程序员 面试

2022年最新iOS面试题(附答案)

iOSer

ios iOS面试 ios开发 iOS 知识体系 iOS涨薪

Nebula Graph 在企查查的应用

NebulaGraph

数据库 开源 图数据库 知识图谱

攻击面管理(ASM)技术详解和实现

风向标

网络安全 asm 安全419 零零信安

中文在线研讨会 | 如何突破Jenkins瓶颈,实现集中管理、灵活高效的CI/CD

龙智—DevSecOps解决方案

ci 持续集成 持续交付

数据分析师如何正确地提意见?

博文视点Broadview

一眼定位问题,函数计算发布日志关键词秒检索功能

阿里巴巴云原生

在线SQL(Insert/Update)语句转JSON工具

入门小站

工具

踏雪痕项目管理学习笔记

踏雪痕

项目管理 PMP Certification 3月程序媛福利 3月月更

python pandas loc布尔索引(指定条件下的索引),你花了多久弄明白架构设计

程序媛可鸥

Python 程序员 面试

周末给女友讲了遍加密算法,没想到...

浅羽技术

算法 安全 加密算法

性能测试中Disruptor框架ExceptionHandler使用分享

FunTester

Disruptor 性能测试 接口测试 异常处理 FunTester

用户文章 | 没有什么比现成的解决方案更香的了 - P4Python 玩家速看

龙智—DevSecOps解决方案

perforce P4 Perforce Helix Core P4Python

在线JSON转CSV格式文件工具

入门小站

工具

虚位以待 | 龙智有你更出彩

龙智—DevSecOps解决方案

求职 招聘

【网络安全】记一次网站站点渗透

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

315权益日解读:“幸运”大牌和巨头,“挡枪”作坊和“小弟”?

易观分析

315晚会 央视315晚会 消费者权益

python sorted()函数及sort()方法,零基础Python开发

程序媛可鸥

Python 程序员 面试

龙蜥一站式质量协作平台T-One上线,助你轻松完成测试

OpenAnolis小助手

开源 测试 软件包 协作平台

代码安全 | 什么是OWASP?OWASP十大漏洞解析

龙智—DevSecOps解决方案

漏洞 安全漏洞 漏洞防护 OWASP十大漏洞 静态代码安全

什么牌子的云堡垒机好用?效果好?

行云管家

云计算 堡垒机 云堡垒机

企业CICD规模化落地浅析

阿里云云效

云计算 阿里云 云原生 CI/CD 持续交付

SQL Server 2012大幅增强了T-SQL_语言 & 开发_Jonathan Allen_InfoQ精选文章