SQL Server里那些TSQL新玩意儿和实用技巧全攻略
- 问答
- 2026-01-02 12:45:06
- 3
主要参考了SQL Server官方文档(Microsoft Docs)、Brent Ozar博客、SQL Shack网站、MSSQLTips网站等社区常见的技术分享内容。
SQL Server里那些TSQL新玩意儿和实用技巧全攻略
第一部分:实用的字符串处理新功能
以前在SQL Server里处理字符串非常麻烦,比如拆分字符串需要写循环或者复杂的CHARINDEX和SUBSTRING组合,现在有了几个好用的新函数。
-
STRING_SPLIT函数 这个函数是很多人的福音,它能把一个用特定分隔符连接的字符串,直接拆分成多行数据,你有一个字符串‘苹果,香蕉,橘子’,你想把它拆成三行,每行一个水果。 用法很简单:
SELECT VALUE FROM STRING_SPLIT('苹果,香蕉,橘子', ','),结果就会返回一个表,里面有三行数据,VALUE列分别是“苹果”、“香蕉”、“橘子”,这在处理前端传过来的ID列表时特别有用。来源:SQL Server 2016及更高版本引入的功能,在官方文档中有详细说明。 -
STRING_AGG函数 这个是STRING_SPLIT的反向操作,它能把多行数据合并成一个字符串,并且用你指定的分隔符连接起来,你想把一个班级里所有学生的名字用逗号连起来显示在一行里。 用法:
SELECT STRING_AGG(学生姓名, ',') WITHIN GROUP (ORDER BY 学号) AS 所有学生 FROM 学生表,这样就能得到“张三,李四,王五”这样的结果。来源:SQL Server 2017及更高版本引入。 -
CONCAT_WS函数 这个函数比老的CONCAT函数更聪明,CONCAT是把多个字符串直接连起来,但如果其中有NULL值,整个结果就会变成NULL,CONCAT_WS允许你指定一个分隔符,并且会自动忽略NULL值。
SELECT CONCAT_WS('-', '2023', NULL, '01') AS 日期,结果是“2023-01”,中间NULL的部分被跳过了,非常干净。来源:SQL Server 2017及更高版本引入。
第二部分:让查询更强大的新关键词
-
OFFSET FETCH - 新一代的分页方法 以前做分页查询,大家基本都用
TOP或者复杂的ROW_NUMBER()函数,现在有了更直观的方法,就是OFFSET...FETCH,它就像是告诉SQL Server:“跳过前N行,然后取M行回来。” 用法:SELECT * FROM 订单表 ORDER BY 下单时间 DESC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY,这句话的意思就是,按照下单时间倒序排列,跳过前20行(也就是前两页),然后取接下来的10行(第三页数据),这比用ROW_NUMBER()写子查询要清晰多了。来源:从SQL Server 2012开始引入,是ORDER BY子句的扩展。 -
STRING_ESCAPE函数 当你要在字符串里处理一些特殊字符(比如制表符、换行符)时,这个函数可以帮你把它们转换成安全的转义序列,这在生成JSON或动态SQL时特别有用,能防止注入和格式错误。 用法:
SELECT STRING_ESCAPE(‘这是一个换行:’ + CHAR(10) + ‘第二行’, ‘json’),它会将换行符转换成JSON认可的\n。来源:SQL Server 2016引入。
第三部分:数据验证和类型处理技巧
-
TRY_PARSE 和 TRY_CAST 在数据清洗时,经常遇到把字符串转成数字或日期的情况,如果字符串格式不对,直接用
CAST或PARSE会报错,导致整个查询失败,用TRY_开头的版本就不会,它会返回NULL。SELECT TRY_CAST('abc' AS INT)。‘abc’明显不是数字,所以这个查询不会报错,而是平静地返回一个NULL值,这样你就可以用WHERE TRY_CAST(某列 AS INT) IS NOT NULL来轻松过滤掉脏数据。来源:SQL Server 2012引入。 -
CHOOSE 和 IIF 函数 这两个是简化版的条件判断函数,虽然用CASE WHEN都能实现,但写起来更简洁。
IIF:相当于简单的IF...ELSE。SELECT IIF(成绩 >= 60, '及格', '不及格') FROM 成绩表。CHOOSE:相当于一个微型数组。SELECT CHOOSE(2, '苹果', '香蕉', '橘子'),它会返回第二个选项,也就是“香蕉”。 注意,它们虽然方便,但不要用在数据量巨大的查询中,因为可能影响性能。来源:SQL Server 2012引入。
第四部分:关于NULL值的高级处理
- CONCAT函数忽略NULL
前面提到了CONCAT_WS,其实普通的CONCAT函数也从一开始就设计为自动忽略NULL。
SELECT CONCAT('Hello', NULL, 'World')会得到 ‘HelloWorld’,而不是NULL,这一点和直接用加号连接字符串完全不同(加号遇到NULL会得到NULL),是个很重要的细节。来源:SQL Server 2012引入。
第五部分:系统视图和动态管理视图的实用技巧
这不是TSQL语法,但绝对是每个SQL Server使用者必须知道的技巧。
-
sp_whoisactive 这虽然不是内置函数,而是由专家Adam Machanic写的著名存储过程,但几乎成了DBA的必备工具,它能帮你快速查看当前服务器上哪些查询正在运行,跑了多久,阻塞了谁,用了多少CPU和读写,比系统自带的
sp_who和sp_lock强大无数倍,你需要从网上下载并部署到你的服务器上。来源:这是一个广为人知的社区脚本,在Brent Ozar等知名博客上被反复推荐。 -
查询表的大小信息 你想知道哪个表最占空间吗?可以查询系统视图,一个常用的查询是:
SELECT t.name AS 表名, p.rows AS 行数, SUM(a.total_pages) * 8 AS 总空间KB FROM sys.tables t INNER JOIN sys.partitions p ON t.object_id = p.object_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id GROUP BY t.name, p.rows ORDER BY 总空间KB DESC;这个查询能帮你快速找到“大胖子”表。来源:这种查询在MSSQLTips和SQL Shack等网站上有很多变体,是常见的空间分析技巧。
总结一下,SQL Server近些年增加了大量让TSQL写起来更简单、更强大的功能,从字符串处理、分页查询,到更安全的数据类型转换,多多利用这些“新玩意儿”,能极大提高你写SQL的效率和质量,也让代码更易读,关键是,要多用,多练习,把它们变成你的本能反应。

本文由寇乐童于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/73084.html