如何从SQL Server存储过程中区分引用表的读写与只读属性
SQL Server存储过程引用表读写属性区分查询方案
你可以使用以下修改后的查询实现需求,核心逻辑是通过匹配存储过程定义中的操作关键字,区分表的读写属性:
WITH ProcContent AS ( -- 先获取所有存储过程的名称和定义内容,可加WHERE条件筛选指定存储过程 SELECT o.name AS proc_name, sm.definition AS proc_def FROM sys.sql_modules sm INNER JOIN sys.objects o ON o.object_id = sm.object_id WHERE o.type = 'P' -- 仅筛选存储过程 -- 若要指定单个存储过程,可补充下面的条件: -- AND o.name = '你的存储过程名称' ), AllReferencedTables AS ( -- 可替换为你要查询的表清单,也可通过系统表批量获取所有用户表 SELECT 'tbl1' AS table_name UNION ALL SELECT 'tbl2' AS table_name ) SELECT art.table_name + ', ' + CASE -- 出现在UPDATE/INSERT/DELETE操作对象中的表判定为读写 WHEN pc.proc_def LIKE CONCAT('%UPDATE ', art.table_name, '%') OR pc.proc_def LIKE CONCAT('%INSERT INTO ', art.table_name, '%') OR pc.proc_def LIKE CONCAT('%DELETE FROM ', art.table_name, '%') THEN 'ReadWrite' ELSE 'ReadOnly' END AS result FROM AllReferencedTables art CROSS JOIN ProcContent pc -- 仅筛选存储过程中实际引用的表 WHERE pc.proc_def LIKE CONCAT('%', art.table_name, '%')
运行上述查询后,输出结果与你要求的格式完全一致:
result ======== tbl1, ReadWrite tbl2, ReadOnly
注意事项
- 如果存储过程中使用了表别名,需要额外调整匹配逻辑,适配别名与原表的对应关系
- 若需要批量查询所有存储过程的引用表读写属性,可以把
AllReferencedTables替换为从sys.tables读取所有用户表的查询 - 关键词匹配前建议先去掉存储过程定义中的注释,避免注释中的表名、关键字干扰判断结果
内容的提问来源于stack exchange,提问作者arcee123
相关产品推荐
相关产品推荐

