SQL Server 统计方法

本文整理了 SQL Server 数据库中常用的元数据查询与统计脚本,涵盖字段依赖查询、表结构信息、存储过程统计及对象引用关系等内容。以下脚本可直接在查询分析器中执行,请根据实际需求替换其中的对象名称(如 '表名称''字段名称' 等)。

1. 查询字段在存储过程和视图中的使用情况

用于查找特定字段被哪些存储过程或视图所引用。

SELECT DISTINCT
    OBJECT_NAME(sd.id) AS Dependent_Object,
    (
        SELECT xtype
        FROM sysobjects so
        WHERE so.id = sd.id
    ) AS Object_Type
FROM
    sysobjects so
    INNER JOIN syscolumns sc ON so.id = sc.id
    INNER JOIN sysdepends sd ON so.id = sd.depid AND sc.colid = sd.depnumber
WHERE
    so.id = OBJECT_ID('表名称')
    AND sc.name = '字段名称';

2. 查询表列信息

获取指定表的字段名称、数据类型及长度等详细信息。

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = '表名称';

3. 统计存储过程的行数

计算存储过程定义中的代码行数(基于换行符统计)。

SELECT
    OBJECT_NAME(object_id) AS ProcedureName,
    (LEN(definition) - LEN(REPLACE(definition, CHAR(10), ''))) AS LineCount
FROM
    sys.sql_modules
WHERE
    object_id = OBJECT_ID('ProcedureName'); -- 请替换 ProcedureName 为你的存储过程名称

4. 统计引用当前存储过程的对象

查询哪些实体引用了指定的存储过程。

SELECT * 
FROM sys.dm_sql_referencing_entities ('dbo.ProcedureName', 'OBJECT');

5. 统计引用当前表的存储过程

查询哪些实体引用了指定的数据表。

SELECT * 
FROM sys.dm_sql_referencing_entities ('dbo.表名称', 'OBJECT');

6. 统计存储过程引用的对象及过程

查看指定存储过程内部引用了哪些表、视图或其他存储过程。

SELECT
    referenced_id,
    referenced_entity_name AS table_name,
    referenced_minor_name AS referenced_column_name,
    is_all_columns_found
FROM
    sys.dm_sql_referenced_entities ('dbo.ProcedureName', 'OBJECT');

7. 查询字段被哪些对象使用

通过系统表查询包含特定字段名的所有对象。

SELECT [name] 
FROM [dbo].sysobjects 
WHERE id IN (
    SELECT id 
    FROM [dbo].syscolumns 
    WHERE name = '字段名称'
);

8. 查询表被哪些存储过程和视图使用

利用 sys.sql_expression_dependencies 获取更详细的依赖关系,包括架构名、实体名及列信息。

SELECT 
    OBJECT_SCHEMA_NAME(referencing_id) AS referencing_schema_name, 
    OBJECT_NAME(referencing_id) AS referencing_entity_name,  
    o.type_desc AS referencing_desciption,  
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,  
    referencing_class_desc, 
    referenced_class_desc, 
    referenced_server_name, 
    referenced_database_name, 
    referenced_schema_name, 
    referenced_entity_name,  
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name, 
    is_caller_dependent, 
    is_ambiguous 
FROM sys.sql_expression_dependencies AS sed 
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id 
WHERE referenced_id = OBJECT_ID(N'表名称');

9. 存储过程使用情况统计

统计存储过程的创建时间、修改时间、缓存信息及执行次数。此查询结合了新旧系统视图,并过滤了系统对象及未被引用的过程。

SELECT TOP 1000 
    a.name AS 存储过程名称,
    a.create_date AS 创建日期,
    a.modify_date AS 修改日期,
    b.cached_time AS 缓存时间,
    b.last_execution_time AS 最后执行日期,
    b.execution_count AS 执行次数
FROM sys.procedures a
LEFT JOIN sys.dm_exec_procedure_stats b ON a.object_id = b.object_id AND b.database_id = '6'
WHERE 
    a.is_ms_shipped = 0 
    AND a.name IN (
        SELECT DISTINCT name
        FROM sysobjects o, syscomments s
        WHERE o.id = s.id
          AND a.name NOT IN (
              SELECT d.referenced_entity_name
              FROM sys.sql_expression_dependencies AS d 
              INNER JOIN sys.objects AS o ON d.referencing_id = o.object_id
              WHERE d.referenced_entity_name IN (SELECT name FROM sys.procedures)
          )
    )
ORDER BY b.execution_count DESC;
说明:部分脚本使用了 sysobjectssyscolumns 等 legacy 系统表,这些表在较新版本的 SQL Server 中仅为兼容性保留。建议在新开发中优先使用 sys.objectssys.columns 等现代目录视图。脚本中的数据库 ID(如 database_id = '6')需根据实际环境调整。