怎么用SQL语句查看SQL Server的结构信息

发布时间:2021-08-30 23:29:14 作者:chen
来源:亿速云 阅读:245
# 怎么用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;

数据库结构查询

1. 获取数据库基本信息

-- 所有数据库列表
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('数据库名');

2. 架构信息查询

-- 查看所有架构
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';

表结构查询

1. 基本表信息

-- 当前数据库所有表
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 '表名';

2. 列信息查询

-- 获取表的列信息
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 = '表名';

索引信息查询

1. 索引基本信息

-- 表的索引信息
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;

2. 外键关系

-- 查看外键约束
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('表名');

存储过程与函数

1. 存储过程查询

-- 查看所有存储过程
SELECT 
    name,
    create_date,
    modify_date
FROM sys.procedures;

-- 查看存储过程定义
SELECT OBJECT_DEFINITION(OBJECT_ID('存储过程名'));

-- 或者使用
EXEC sp_helptext '存储过程名';

2. 函数信息

-- 查看用户定义函数
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('函数名');

权限与安全

1. 用户权限

-- 数据库用户和角色
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; -- 对象类权限

2. 服务器级权限

-- 登录账户信息
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;

性能相关结构

1. 执行计划缓存

-- 查看缓存的执行计划
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;

2. 统计信息

-- 表的统计信息
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('表名');

最佳实践

  1. 使用适当的视图

    • 需要SQL标准兼容时用INFORMATION_SCHEMA
    • 需要详细元数据时用系统目录视图
    • 需要动态管理信息时用DMVs
  2. 查询性能优化

    -- 只查询需要的列
    -- 添加适当的WHERE条件
    -- 对大型系统考虑使用过滤条件
    
  3. 文档化脚本

    -- 保存常用查询为脚本文件
    -- 添加注释说明查询目的
    -- 考虑创建自定义存储过程封装常用查询
    
  4. 安全注意事项

    • 确保只有授权用户能访问系统视图
    • 生产环境避免直接查询sys.objects等基础视图
    • 考虑使用VIEW DEFINITION权限而非更高权限

通过熟练掌握这些SQL查询,您可以全面了解SQL Server数据库的结构信息,为数据库管理、性能优化和故障排查提供有力支持。 “`

这篇文章大约2050字,涵盖了SQL Server结构信息查询的主要方面,采用Markdown格式编写,包含代码示例和结构化标题。

推荐阅读:
  1. sql语句都有哪些
  2. SQL语句大全  

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sql server

上一篇:php数据访问的增删改查操作

下一篇:Docker中无法停止或删除容器服务问题怎么解决

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》