SqlServer实用系统视图,你了解多少?
- 前言
- master..spt_values
- sysdatabases
- sysprocesses
- 一套组合拳
- sysobjects
- sys.all_objects
- syscolumns
- systypes
- syscomments
- sysindexes
- 结束语
前言
在使用任何数据库软件的时候,该软件都会提供一些可能不是那么公开,但很多人都知道的一些系统表或系统视图,了解这些内容,有助与我们日常工作中的一些特殊需求。本文介绍一些老顾所常用的SqlServer的系统视图给大家。
master…spt_values
实用程度 ⭐️⭐️⭐️
重要程度 💡
这是一个干什么用的视图,其实老顾并不是很清楚,但是,这个视图里,有很多很多纯数字的数据,在 number 这一列。
而如果将 type 限定为 p ,则会出现一个 0-2047 的连续数字列。。。。
如此。。。我们可以很方便的用 cross apply 的方式进行数据填充、补全,或者直接用这个 number 生成连续的日期等,总之,可以用数学计算完成的一些连续数据,都可以用这个方式直接生成了。
sysdatabases
实用程度 ⭐️
重要程度 💡
这个视图列举了当前数据库实例中的所有数据库的一些基本信息,比如数据库名,对应id,创建时间等,这个视图中最重要的其实是最后两列,filename和version,分别列出了存储路径和数据库版本。
为什么老顾会把这个不太常用的系统视图拿出来呢,因为曾经碰到过一个小伙伴,在比较新的 mssql 2019 中附加了 mssql 2012 的数据库,结果小伙伴没注意啊,直接按照 2019的格式去添加了存储过程,结果怎么都不能用,就是因为没有注意版本问题。嗯版本变更也很简单,看下图,一眼就明白
老顾使用的数据库版本已经比较老了。。。木钱啊
sysprocesses
实用程度 ⭐️⭐️⭐️⭐️⭐️
重要程度 💡💡💡💡
这是一个很重要的系统视图,他列举了当前正在运行的所有数据库线程的运行情况,非常重要的一个实时的反馈信息。
其中的 blocked 列,就是表示出现了状态锁了,而数据就是锁信息所在的 spid。而这个视图中还有一列 sql_handle,我们可以通过 系统函数 sys.dm_exec_sql_text 将其直接转换成可读的 sql 指令,嗯,也有可能是触发器或存储过程之类的。方便我们进行各种追踪。
非常推荐各位去熟悉这个视图。各位在百度里搜索到的一些关于高消耗、进程锁啦,可以看到,基本都指向了这个视图。优化数据库工作,这个视图是不可忽略的一部分参考内容。
一套组合拳
sysobjects
实用程度 ⭐️⭐️⭐️⭐️
重要程度 💡💡💡
一个以对象为内容的信息视图,列出了当前数据(注意,我这里说的是当前数据库哦。)中锁包含的各种对象。
其中 name 是对象名称,xtype 是对象类型。
然后有人告诉我,xtype 看不懂啊,他是什么类型?于是很多小伙伴去百度查 xtype 。。。。其实没必要哦,下一个视图你值得拥有。
sys.all_objects
实用程度 ⭐️
重要程度 💡
额。。。也许有人对这个评价有不同意见。。。但老顾用这个视图,其实就是为了翻译 xtype 。。。。
sys.all_objects 获得的数据,其实是全数据库实例的数据,而结合 sysobjects ,则可以只列当前数据库的内容了,然后把 type_desc 列出来,不就知道 xtype 是干嘛的了,这个对象到底是个什么东西了么?为什么要去百度查 xtype 呢?
select type_desc,o.* from sysobjects o
inner join sys.all_objects a on o.id=a.object_id
syscolumns
实用程度 ⭐️⭐️
重要程度 💡💡💡
这是一个列出当前数据库中,所有表的字段信息的视图,包含了列名,列类型 xtype(。。。。又见xtype,嘿嘿,这个可不能和 all_objects 一起用了,这个一会讲怎么翻译出来),列所在索引colorder(不是color der,是 col order哦),字段默认值信息,以及重要的信息 id。这里的 id 可不是字段的 id 哦,而是所属对象的 id,也就是表或者视图的 id,通过 object_name(id) 就可以得到所属对象的名字了。反正这个视图里杂七杂八的东西还真不少。但如果不考虑动态生成指令以及自动分发数据的话,其实这个视图用的还是比较少的。
systypes
实用程度
重要程度 💡
嗯,没啥用,就是翻译 syscolumns xtype 用的一个类型视图,包含自定义数据类型的,这个可以放心
syscomments
实用程度 ⭐️⭐️⭐️⭐️
重要程度 💡💡💡
前边。。我们已经可以通过 sysobjects 找到很多内容了,比如 tr 就是触发器,p就是存储过程了,这个时候,我们要查看触发器或存储过程的内容怎么办?难道要一个一个打开修改才能看到?No No No,syscomments 你值得拥有。
select *
from sysobjects o
inner join syscomments c on c.id=o.id
where xtype='p'
可以看到,text 列就已经把内容列出来了,唯一需要注意的是,可能有的内容过长,他会分成多行显示,你需要自己再用 for xml 之类的方法,给他拼到一起才是完整内容哦。
用这个 syscomments 就很方便的能检测到,某些数据的变动会影响到哪些触发器或存储过程了。
嗯,其实。。。。syscolumns 的描述,默认值之类的,也在这个 syscomments 里,有兴趣的可以自己翻翻看
sysindexes
实用程度 ⭐️
重要程度 💡💡
这个视图则是当前数据库的索引信息了,老顾对这个视图最常用的是查所有表的数据一共有多少,也就是 indid = 1 时,rows 的信息了
结束语
其实,还有很多很多的系统视图,诸如 sys.tables、sysfiles、sys.dm_exec_query_stats之类的,老顾平时用不到,不太熟悉,也许会有一些遗漏,还请见谅。
基本上以上这些视图熟悉了,就可以完成以前所无法完成的一些内容,比如动态生成 sql 时的列,就可以通过 syscolumns 来生成,数据类型可以通过 xtype 来校验,甚至默认值还可以用 syscomment 来自动填充了。就如同老顾在《使用一个存储过程完成数据插入和更新(使用xml)(通用insert和update)(mssql2008以上)》里的使用一样,通过系统视图,完成一些可自动化的东西,很是惬意哦。
如果真的特别对这些内容感兴趣,可以自行通过 master 库的 sysobjects 查看,并验证哦。