Sql Server 统计方法
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;说明:部分脚本使用了sysobjects、syscolumns等 legacy 系统表,这些表在较新版本的 SQL Server 中仅为兼容性保留。建议在新开发中优先使用sys.objects、sys.columns等现代目录视图。脚本中的数据库 ID(如database_id = '6')需根据实际环境调整。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/sql-server-tong-ji-fang-fa.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。