当前位置:首页 > 问答 > 正文

数据库里那些实用的SQLServer脚本函数,分享给你用着方便点的东西

查询所有表的行数(快速了解数据量)

有时候接手一个新库,你肯定想知道哪个表最大,里面大概有多少数据,一条脚本就能扫出来,比在管理界面一个个点开看快多了。

来源:这是根据系统视图 sys.partitionssys.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.syscommentssys.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及以上)

数据库里那些实用的SQLServer脚本函数,分享给你用着方便点的东西

在老的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 引入的内置函数。

有一个学生选课表,你想看每个学生都选了哪些课:

数据库里那些实用的SQLServer脚本函数,分享给你用着方便点的东西

-- 假设表结构:StudentID, CourseName
SELECT
    StudentID AS 学生ID,
    STRING_AGG(CourseName, ', ') AS 所选课程 -- 用逗号和空格连接
FROM
    选课表
GROUP BY
    StudentID;

这样,结果里每个学生就对应一行,他选的所有课程都整齐地放在一个单元格里了。

判断表是否存在,存在就删除

在写一些临时性的脚本,比如建表测试时,为了避免重复创建报错,通常会先检查一下这个表存不存在,存在就删掉,把这个逻辑写成固定的模板。

来源:根据系统视图 sysobjectssys.tables 的判断。

IF OBJECT_ID('dbo.你的表名', 'U') IS NOT NULL -- 'U' 表示用户表
    DROP TABLE dbo.你的表名;
CREATE TABLE dbo.你的表名 (...);

这是个非常实用的脚本片段,可以避免很多“对象已存在”的错误。

查看最近执行的SQL语句(帮助排查问题)

有时候想看看数据库最近都在跑什么语句,是什么在耗资源,可以查动态管理视图 sys.dm_exec_query_statssys.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;

这个能帮你了解数据库近期的活动情况。

这些脚本和函数都是我觉着特别实在的东西,能直接拿来解决日常工作中的小问题,你用到的时候,只需要把里面的表名、字段名换成你自己的就行了,希望对你也有用。