You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:24:02