【问题标题】:How to get the TARGET tables from a stored procedure如何从存储过程中获取目标表
【发布时间】:2021-12-09 09:27:06
【问题描述】:

我知道这个查询可以从 SQL Server 存储过程中提取引用的表。

例如,如果我有这个存储过程:

UPDATE tbl1 
SET symbol = tbl2.symbol, symbol2 = tbl2.symbol2
FROM tbl1
JOIN tbl2 ON tbl1.PK = tbl2.PK

这个查询:

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

还有这个:

SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

两者都返回 tbl1tbl2 作为响应。

我的问题是:tb11 是 SQL 显示的 ReadWrite,tbl2 是 ReadOnly。

如何更新我的查询以进行区分?

所以我的输出应该是:

Response
========
tbl1, ReadWrite
tbl2, ReadOnly

谢谢!

【问题讨论】:

  • “读/写”和“只读”是什么意思 - 您只是在“更新”一个表,但 SQL Server 不维护那种元信息。您可以查找查询文本为 like '%update tbl1%' 并显示您想要指示它插入的任何内容,但这将依赖于单词 update 和正在使用的 tablename,如果它是更新和一个别名呢?
  • 嗨,Stu,感谢您的评论。更新查询将 tb1 连接到 tb2,这意味着正在读取两个表以设置更新,然后更新 tbl1。这意味着 tbl1 被读取然后写入,而 tbl2 不是。使用字符串上下文可能会给我带来不同的结果,因为这是我正在询问的多种 sql 类型之一。
  • 这意味着 tbl1 是目标,我正在尝试区分

标签: sql sql-server tsql stored-procedures


【解决方案1】:

DMV sys.dm_sql_referenced_entities 包含此信息。

下面的查询应该能得到你所需要的东西

SELECT
  name,
  referenced_entity_name,
  is_updated
FROM sys.procedures p
CROSS APPLY sys.dm_sql_referenced_entities(SCHEMA_NAME(p.schema_id) + '.' + p.name,'OBJECT') r
WHERE referenced_minor_name IS NULL;

db<>fiddle

【讨论】:

    【解决方案2】:

    试试sys.sql_dependencies,例如

    select  object_name(d.referenced_major_id) referenced_object, 
            object_name(d.object_id) referenced_by,  
            max(cast(d.is_updated as int)) is_updated
    from sys.sql_dependencies d
    join sys.objects o
      on d.object_id = o.object_id
    where o.type_desc = 'SQL_STORED_PROCEDURE'
    group by d.referenced_major_id, d.object_id
    order by d.object_id
    

    但请注意,具有延迟名称解析的过程和使用动态 SQL 访问表的存储过程将不会被跟踪

    【讨论】:

    • 感谢大卫。 is_updated 是否适用于 UPDATES 和 INSERTS?
    • 不推荐使用MS Docssql_dependencies。是否愿意使用sql_expression_dependencies 和/或dm_sql_referenced_entities 提供更具前瞻性的查询?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多