数据库里那些实用的SQLServer脚本函数,分享给你用着方便点的东西
- 问答
- 2026-01-02 01:33:27
- 1
查询所有表的行数(快速了解数据量)
有时候接手一个新库,你肯定想知道哪个表最大,里面大概有多少数据,一条脚本就能扫出来,比在管理界面一个个点开看快多了。
来源:这是根据系统视图 sys.partitions 和 sys.objects 组合查询的常见用法。
SELECT
t.NAME AS 表名,
p.rows AS 行数
FROM
sys.tables t
INNER JOIN
sys.partitions p ON t.object_id = p.object_id
WHERE
p.index_id IN (0, 1) -- 0代表堆表,1代表聚集索引,这样避免重复计数。
ORDER BY
p.rows DESC;
跑一下这个,所有表的数据量就从大到小排好了,一目了然。
搜索整个数据库里某个关键词(找字段、找存储过程)
你肯定遇到过这种情况:领导说“我们系统里有个地方存了客户等级字段,但我不记得在哪个表了”,或者你想找一个包含特定业务逻辑的存储过程,这时候用这个脚本特别方便。
来源:这是查询系统视图 sys.syscomments 和 sys.tables 的经典方法。
DECLARE @SearchStr NVARCHAR(100) = '你要找的关键词' -- 'CustomerLevel'
SELECT
OBJECT_NAME(c.id) AS 对象名称,
c.text AS 对象内容
FROM
sys.syscomments c
WHERE
c.text LIKE '%' + @SearchStr + '%'
这个能帮你找到存储过程、函数、视图这些脚本对象里的内容,如果你想连表字段名也一起找出来,可以用更强大的版本:
DECLARE @SearchStr NVARCHAR(100) = '你要找的关键词'
SELECT
TABLE_NAME AS 表名,
COLUMN_NAME AS 字段名
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMN_NAME LIKE '%' + @SearchStr + '%'
两个一起用,基本上能把数据库里跟这个关键词相关的地方都翻出来。
生成数据库里所有表的“查前100条”语句
有时候做数据探查或者测试,需要快速看一下每个表里的数据长什么样,手动写一堆 SELECT TOP 100 * FROM [表名] 太麻烦了,这个脚本能自动生成所有这些语句,你直接复制出来运行就行。
来源:这是利用系统表动态生成SQL语句的思路。
SELECT 'SELECT TOP 100 * FROM [' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']' AS 查询语句 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' -- 只查普通表,不看视图
运行后,结果栏里就是一行一行的完整SELECT语句,特别省事。
查看表的结构(字段名、类型、是否为空)
想快速了解一张表有哪些字段,每个字段是什么类型,允不允许为空?用这个比用鼠标在图形界面里展开看更快,尤其适合写文档或者写代码时参考。
来源:查询信息架构视图 INFORMATION_SCHEMA.COLUMNS。
SELECT
COLUMN_NAME AS 字段名,
DATA_TYPE AS 数据类型,
IS_NULLABLE AS 是否允许空值
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = '你的表名' -- 把这里换成实际表名
ORDER BY
ORDINAL_POSITION;
字符串分割函数(SQL Server 2016及以上)

在老的SQL Server版本里,把一个用逗号分隔的字符串拆成多行,是件挺头疼的事,得写一堆复杂的SQL,2016版本之后,微软终于内置了一个函数叫 STRING_SPLIT,好用极了。
来源:SQL Server 2016 引入的内置函数。
你有一个字符串 '苹果,香蕉,橘子',想把它拆成三行,每行一个水果:
SELECT value AS 水果 FROM STRING_SPLIT('苹果,香蕉,橘子', ',')
结果就是: 水果
苹果 香蕉 橘子
这个在处理传入的ID列表或者其他逗号分隔的值时,非常非常有用。
字符串拼接函数(SQL Server 2017及以上)
有拆就有合,以前想把一个字段的多行值合并成一个用逗号隔开的字符串,也非常麻烦,通常要用到 FOR XML PATH('') 这种看起来有点奇怪的语法,2017年有了 STRING_AGG 函数,简单多了。
来源:SQL Server 2017 引入的内置函数。
有一个学生选课表,你想看每个学生都选了哪些课:

-- 假设表结构:StudentID, CourseName
SELECT
StudentID AS 学生ID,
STRING_AGG(CourseName, ', ') AS 所选课程 -- 用逗号和空格连接
FROM
选课表
GROUP BY
StudentID;
这样,结果里每个学生就对应一行,他选的所有课程都整齐地放在一个单元格里了。
判断表是否存在,存在就删除
在写一些临时性的脚本,比如建表测试时,为了避免重复创建报错,通常会先检查一下这个表存不存在,存在就删掉,把这个逻辑写成固定的模板。
来源:根据系统视图 sysobjects 或 sys.tables 的判断。
IF OBJECT_ID('dbo.你的表名', 'U') IS NOT NULL -- 'U' 表示用户表
DROP TABLE dbo.你的表名;
CREATE TABLE dbo.你的表名 (...);
这是个非常实用的脚本片段,可以避免很多“对象已存在”的错误。
查看最近执行的SQL语句(帮助排查问题)
有时候想看看数据库最近都在跑什么语句,是什么在耗资源,可以查动态管理视图 sys.dm_exec_query_stats 和 sys.dm_exec_sql_text。
来源:SQL Server 动态管理视图(DMV)的常见用法。
SELECT TOP 20
qs.last_execution_time AS 最后执行时间,
st.text AS 执行的SQL语句
FROM
sys.dm_exec_query_stats qs
CROSS APPLY
sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY
qs.last_execution_time DESC;
这个能帮你了解数据库近期的活动情况。
这些脚本和函数都是我觉着特别实在的东西,能直接拿来解决日常工作中的小问题,你用到的时候,只需要把里面的表名、字段名换成你自己的就行了,希望对你也有用。
本文由芮以莲于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/72788.html
