You need to enable JavaScript to run this app. 如何查询ASE SYBASE或SQL SERVER中存储过程、SQL用到的表和列
优惠活动
大模型
产品
解决方案
定价
更多

如何查询ASE SYBASE或SQL SERVER中存储过程、SQL用到的表和列

获取数据库真实使用的表与列清单方案

以下方案分别覆盖SQL Server和ASE Sybase两种数据库,分为静态依赖查询(查询对象定义中写的所有表/列引用)和实际运行依赖查询(查询真实执行过的SQL用到的表/列,符合「系统真实使用」的需求)两种场景。

一、SQL Server 实现方法

1. 静态依赖查询(查询所有存储过程定义中用到的表和列)

SELECT 
    DISTINCT
    o.name AS 引用存储过程名,
    COALESCE(referenced_schema_name, 'dbo') AS 表Schema,
    referenced_entity_name AS 表名,
    referenced_minor_name AS 列名
FROM 
    sys.objects o
CROSS APPLY 
    sys.dm_sql_referenced_entities (SCHEMA_NAME(o.schema_id) + '.' + o.name, 'OBJECT')
WHERE 
    o.type = 'P' -- 过滤只查询存储过程
    AND referenced_minor_id > 0 -- 过滤仅引用表未引用列的记录

2. 真实运行依赖查询(基于执行计划缓存,查询实际执行过的SQL用到的表和列)

WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT 
    DISTINCT
    t.value('(@Schema)[1]', 'sysname') AS 表Schema,
    t.value('(@Table)[1]', 'sysname') AS 表名,
    t.value('(@Column)[1]', 'sysname') AS 列名
FROM 
    sys.dm_exec_cached_plans cp
CROSS APPLY 
    sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY 
    query_plan.nodes('//ColumnReference') AS ref(t)
WHERE 
    t.exist('@Schema') = 1 
    AND t.exist('@Table') = 1 
    AND t.exist('@Column') = 1
    AND t.value('(@Schema)[1]', 'sysname') NOT IN ('sys', 'INFORMATION_SCHEMA') -- 过滤系统表

注意事项:

  • 执行计划缓存会随数据库重启、缓存淘汰被清空,数据仅覆盖缓存保留周期内的执行记录
  • 如果需要保留更长时间的执行历史,建议开启SQL Server自带的查询存储(Query Store)功能,查询逻辑可以基于查询存储的执行计划视图调整

二、ASE Sybase 实现方法

1. 静态依赖查询(查询所有存储过程定义中用到的表和列)

SELECT DISTINCT
    so.name AS 存储过程名,
    user_name(so2.uid) AS 表Schema,
    so2.name AS 表名,
    sc.name AS 列名
FROM 
    syscomments scm
JOIN 
    sysobjects so ON scm.id = so.id
JOIN 
    sysobjects so2 ON patindex('%' + so2.name + '%', scm.text) > 0
JOIN 
    syscolumns sc ON so2.id = sc.id AND patindex('%' + sc.name + '%', scm.text) > 0
WHERE 
    so.type = 'P' -- 过滤只查询存储过程
    AND so2.type = 'U' -- 过滤只查询用户表

2. 真实运行依赖查询

ASE Sybase可以通过开启语句级审计或者监控服务器(Monitoring Server)捕获实际执行的SQL,解析后提取用到的表和列。也可以用下面的语句查询当前正在运行的SQL涉及的对象:

SELECT 
    DB_NAME(dbid) AS 数据库名,
    object_name(id, dbid) AS 表名,
    sql_text AS 执行的SQL语句
FROM 
    master..sysprocesses
CROSS APPLY 
    master..monProcessSQLText()
WHERE 
    id != 0

注意事项:如果需要获取长期的真实使用记录,建议提前开启ASE的审计功能,持久化保存所有执行的SQL语句后再做批量解析。

内容的提问来源于stack exchange,提问作者RGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 16:27:05