写点什么

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:052500
用户头像

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

关注

评论

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

2023中国(抚远)冷水鱼预制菜高质量发展大会在黑龙江抚远举办

新消费日报

券商数字化创新场景数据中台实践

袋鼠云数栈

数字化转型 数据治理

LED租赁屏市场

Dylan

活动 广告 方案 设备 LED显示屏

es 笔记二之基础查询

Hunter熊

elasticsearch

鲲鹏入晋,乘云而起,华为开发者大会开启“山西时刻”,共话山西鲲鹏生态建设

彭飞

“Cisco Live 2023 大会”云原生观测解决方案成关键看点

乘云数字DataBuff

云原生 APM 可观测性 Cisco 智能运维AIOps

HTML5 游戏开发实战 | 俄罗斯方块

TiAmo

html html5 6 月 优质更文活动

List的拆分的几种方式

EquatorCoco

前端 前端框架 开发框架

代码随想录训练营 Day02 - 数组(下)

jjn0703

算法

IPQ9574 motherboard and QCN9274 network card are perfectly combined to achieve triple-band rate 2.4G/5G/6E

wifi6-yiyi

wifi6 WiFi7

Flink CDC 2.4 正式发布,新增 Vitess 数据源,PostgreSQL 和 SQL Server CDC 连接器支持增量快照,升级 Debezium 版本

Apache Flink

flink

如何用极狐GitLab 为 iOS App 创建自动化CI/CD?详细教程来了

极狐GitLab

ios DevOps gitlab 自动化 CI/CD

AI 和 DevOps:实现高效软件交付的完美组合

SEAL安全

AI DevOps 企业号 6 月 PK 榜

你说搞开发的很累,那做什么工作不累?

树上有只程序猿

科兴未来|浙江丽水市第六届高层次人才创业大赛活动

科兴未来News

6月优质更文活动结果已出炉,快来看看有没有你

InfoQ写作社区官方

热门活动 6 月 优质更文活动

看这个视频,4万人学会云上部署 Stable Diffusion

Serverless Devs

云计算 Serverless 函数计算FC

基于群组实现从 Azure AD 到极狐GitLab 的单点登录

极狐GitLab

统一身份认证 IdP 单点登录 用户同步 配置群组同步

我为什么选择多边形架构做为工程的基础思想

大东(AIP内容运营专员)

Docker容器共享磁盘

高端章鱼哥

Docker Linux

如何基于G6进行双树流转绘制?

EquatorCoco

G6 CRM系统 双树流

如何使用 Flink SQL 探索 GitHub 数据集|Flink-Learning 实战营

Apache Flink

大数据 flink 实时计算

通过构建背景图学习CSS径向渐变

南城FE

CSS 前端开发 渐变

采用Qt+Live555搭建RTSP服务器

DS小龙哥

6 月 优质更文活动

火山引擎A/B测试推出智能流量调优实验,助力汽车行业破局营销困境

字节跳动数据平台

Gartner®DevOps 平台魔力象限出炉,GitLab 获评「领导者」!

极狐GitLab

gitlab 安全 开放平台 开源贡献者 领导者象限

实现淘宝母婴订单实时查询和可视化|Flink-Learning实战营

Apache Flink

大数据 flink

为什么负数的补码等于反码加一

xzy

我在中小型项目SuperCell模式实战经验

大东(AIP内容运营专员)

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