【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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

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

关注

评论

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

美团前端常见面试题整理

loveX001

JavaScript 前端

Tapdata 和 Databend 数仓数据同步实战

Databend

AntDB数据库再获奖,亚信安慧被评为“2022 PostgreSQL中国最佳创新企业”

亚信AntDB数据库

数据库 AntDB 国产数据库 AntDB数据库 企业号 2 月 PK 榜

如何通过Java 代码设置 Word 文档页边距

在下毛毛雨

C# .net word文档 页边距

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

西柚子

测试开发 | Dubbo 接口测试技术,测试开发进阶必备(附源码)

霍格沃兹测试开发学社

ChatGPT专题 | 万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的

工赋开发者社区

社招前端二面面试题总结

loveX001

JavaScript 前端

设备上报二进制数据在 IoT 平台解析实践——实践类

阿里云AIoT

小程序 监控 物联网 传感器 测试技术

经常会采坑的javascript原型应试题

loveX001

JavaScript 前端

阿里云云通信风控系统的架构与实践

阿里云视频云

云计算 云通信

行业分析| OA系统中的实时通讯

anyRTC开发者

音视频 远程办公 视频会议 视频通话 OA

和狂飙的 ChatGPT 聊聊软件开发的现在与未来

极狐GitLab

DevOps 研发效能 DevSecOps 极狐GitLab ChatGPT

数字经济赋能乡村建设,助力乡村全面振兴

加入高科技仿生人

低代码 数字经济 乡村振兴 农村

IoT物联网设备端硬件上云技术方案详解——实践类

阿里云AIoT

物联网 存储 开发工具 数据采集 传感器

工业数字孪生:西门子工业网络与设备虚拟调试案例(TIA+MCD+SINETPLAN)

工赋开发者社区

低代码选型,论协同开发的重要性

葡萄城技术团队

IoT企业物联网平台,从设备端到云端业务系统全链路开发实战——实践类

阿里云AIoT

数据库 监控 物联网 存储 消息中间件

NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询

PingCAP

TiDB

如何使用 Kubernetes 实现应用程序的弹性伸缩

API7.ai 技术团队

Prometheus api 网关 APISIX Serverless Kubernetes

基于 IoT物联网 + 表格存储DB + DataV 搭建实时环境监控大屏——实践类

阿里云AIoT

数据库 监控 物联网 存储 数据可视化

代码的发展与终结

SoFlu软件机器人

用户属性-MQTT 5.0新特性

EMQ映云科技

物联网 IoT mqtt 企业号 2 月 PK 榜 用户属性

建议收藏!数据可视化大屏设计必备步骤

葡萄城技术团队

前端react面试题(边面边更)

beifeng1996

前端 React

大前端CPU优化技术--SIMD技术

江湖修行

simd neon

2023年Java面试正确姿势(1000+面试题附答案解析)

Java编程日记

Java 架构 后端 java程序员 java面试

0经验拿下大厂年薪30万Offer,我的面试求职之路(含面试题)~

霍格沃兹测试开发学社

LeetCode题解:89.格雷编码,归纳法,详细注释

Lee Chen

JavaScript LeetCode

深入理解JS作用域链与执行上下文

loveX001

JavaScript

React的useLayoutEffect和useEffect执行时机有什么不同

beifeng1996

前端 React

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