在SQL Server里查所有表名,最直接的办法就是查系统视图。别绕弯子,`sys.tables`就是干这个的。跑一句`SELECT name FROM sys.tables`,当前数据库里所有用户表的名字就齐刷刷列出来了。这玩意儿比`INFORMATION_SCHEMA.TABLES`快,因为它是SQL Server自己的内部视图,专门针对引擎优化过。
不过你光知道这个还不够。我见过太多人栽在“当前数据库”这几个字上。你连的是`master`库,跑出来全是系统表,一脸懵。所以写代码前先确认`USE YourDatabaseName`,或者直接在查询里写`SELECT name FROM YourDatabaseName.sys.tables`。这个坑我踩过,当年排查一个存储过程,查了半天表名对不上,最后发现是连错库了。
再说个实用场景。你要做数据库文档,得把表名、字段、类型、注释全导出来。这时候单查`sys.tables`就不够用了,得连`sys.columns`和`sys.extended_properties`。给你个组合拳:
SELECT t.name AS TableName, c.name AS ColumnName, ty.name AS DataType FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id JOIN sys.types ty ON c.user_type_id = ty.user_type_id ORDER BY t.name, c.column_id 这段能把你库里所有表的字段结构一次性拉出来。注意`ORDER BY c.column_id`,这是按建表时的字段顺序排的,别用`c.name`排序,否则字段顺序全乱了。
还有个冷门但好用的技巧——用`OBJECT_ID`过滤临时表。有时候你想看存储过程里创建的临时表,但`sys.tables`里根本找不到。临时表在`tempdb`里,得切到那个库去查:`SELECT name FROM tempdb.sys.tables WHERE name LIKE '#%'`。别笑,我之前调试一个复杂报表,就是靠这招找到临时表结构,才知道中间算错了哪一步。
最后提醒一句:别老想着用`SELECT * FROM INFORMATION_SCHEMA.TABLES`。那个视图虽然标准,但性能差,而且不包含索引、分区这类物理信息。真要干重活,系统视图才是亲儿子。你写存储过程或者做数据库对比工具的时候,多花五分钟翻翻`sys.objects`、`sys.indexes`,比到处搜“sqlserver查所有表名”靠谱得多。
对了,如果你只是想快速数一下有多少张表,用`SELECT COUNT(*) FROM sys.tables`就行。但如果是做数据字典,建议把表名、创建时间、修改时间一起查出来:
SELECT name, create_date, modify_date FROM sys.tables ORDER BY create_date DESC 这样你能看出哪些表是最近才加的,哪些是老古董一直没动过。做数据库清理的时候,这招比看注释管用——注释可能骗人,时间戳不会。
