# 怎么用SQL语句查看SQL Server的结构信息 ## 目录 1. [系统视图概述](#系统视图概述) 2. [数据库结构查询](#数据库结构查询) 3. [表结构查询](#表结构查询) 4. [索引信息查询](#索引信息查询) 5. [存储过程与函数](#存储过程与函数) 6. [权限与安全](#权限与安全) 7. [性能相关结构](#性能相关结构) 8. [最佳实践](#最佳实践) ## 系统视图概述 SQL Server提供了丰富的系统视图和函数来获取数据库结构信息,主要分为三类: - **目录视图(Catalog Views)**:最常用的系统视图,提供SQL Server元数据信息 - **信息架构视图(Information Schema Views)**:符合SQL标准的跨平台视图 - **系统存储过程**:`sp_help`等实用程序 ```sql -- 查看所有系统视图 SELECT name FROM sys.views WHERE name LIKE 'sys%' OR name LIKE 'dm%' ORDER BY name;
-- 所有数据库列表 SELECT name, state_desc, recovery_model_desc FROM sys.databases; -- 特定数据库文件信息 SELECT name, physical_name, size/128.0 AS size_MB FROM sys.master_files WHERE database_id = DB_ID('数据库名');
-- 查看所有架构 SELECT name, schema_id, principal_id FROM sys.schemas; -- 特定架构下的对象 SELECT o.name, o.type_desc FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE s.name = 'dbo';
-- 当前数据库所有表 SELECT t.name AS table_name, s.name AS schema_name FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id; -- 表结构详细信息 EXEC sp_help '表名';
-- 获取表的列信息 SELECT c.name AS column_name, tp.name AS data_type, c.max_length, c.precision, c.scale, c.is_nullable FROM sys.columns c JOIN sys.types tp ON c.user_type_id = tp.user_type_id WHERE c.object_id = OBJECT_ID('表名'); -- 使用信息架构视图(跨平台兼容) SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '表名';
-- 表的索引信息 SELECT i.name AS index_name, i.type_desc, c.name AS column_name, ic.key_ordinal FROM sys.indexes i JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE i.object_id = OBJECT_ID('表名'); -- 索引碎片信息 SELECT OBJECT_NAME(i.object_id) AS table_name, i.name AS index_name, ips.avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id WHERE ips.avg_fragmentation_in_percent > 10;
-- 查看外键约束 SELECT fk.name AS constraint_name, OBJECT_NAME(fk.parent_object_id) AS parent_table, COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS parent_column, OBJECT_NAME(fk.referenced_object_id) AS referenced_table, COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS referenced_column FROM sys.foreign_keys fk JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id WHERE fk.parent_object_id = OBJECT_ID('表名');
-- 查看所有存储过程 SELECT name, create_date, modify_date FROM sys.procedures; -- 查看存储过程定义 SELECT OBJECT_DEFINITION(OBJECT_ID('存储过程名')); -- 或者使用 EXEC sp_helptext '存储过程名';
-- 查看用户定义函数 SELECT name, type_desc, create_date FROM sys.objects WHERE type IN ('FN', 'IF', 'TF', 'FS', 'FT'); -- 各种函数类型 -- 查看函数参数 SELECT p.name AS parameter_name, TYPE_NAME(p.user_type_id) AS data_type FROM sys.parameters p WHERE p.object_id = OBJECT_ID('函数名');
-- 数据库用户和角色 SELECT princ.name AS username, princ.type_desc AS user_type, role.name AS role_name FROM sys.database_principals princ LEFT JOIN sys.database_role_members rm ON princ.principal_id = rm.member_principal_id LEFT JOIN sys.database_principals role ON rm.role_principal_id = role.principal_id; -- 对象级权限 SELECT USER_NAME(grantee_principal_id) AS grantee, permission_name, state_desc, OBJECT_NAME(major_id) AS object_name FROM sys.database_permissions WHERE class = 1; -- 对象类权限
-- 登录账户信息 SELECT name, type_desc, create_date, is_disabled FROM sys.server_principals WHERE type IN ('S', 'U', 'G'); -- SQL用户、Windows用户、组 -- 服务器角色成员 SELECT rol.name AS server_role, mem.name AS member_name FROM sys.server_role_members rm JOIN sys.server_principals rol ON rm.role_principal_id = rol.principal_id JOIN sys.server_principals mem ON rm.member_principal_id = mem.principal_id;
-- 查看缓存的执行计划 SELECT qt.text AS query_text, cp.objtype AS plan_type, cp.size_in_bytes/1024 AS size_kb, qp.query_plan FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) qt CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp;
-- 表的统计信息 SELECT s.name AS stats_name, s.auto_created, s.user_created, COL_NAME(sc.object_id, sc.column_id) AS column_name FROM sys.stats s CROSS APPLY sys.stats_columns(sc) WHERE s.object_id = OBJECT_ID('表名');
使用适当的视图:
INFORMATION_SCHEMA
查询性能优化:
-- 只查询需要的列 -- 添加适当的WHERE条件 -- 对大型系统考虑使用过滤条件
文档化脚本:
-- 保存常用查询为脚本文件 -- 添加注释说明查询目的 -- 考虑创建自定义存储过程封装常用查询
安全注意事项:
sys.objects
等基础视图VIEW DEFINITION
权限而非更高权限通过熟练掌握这些SQL查询,您可以全面了解SQL Server数据库的结构信息,为数据库管理、性能优化和故障排查提供有力支持。 “`
这篇文章大约2050字,涵盖了SQL Server结构信息查询的主要方面,采用Markdown格式编写,包含代码示例和结构化标题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。