我如何检查sql server的"视图"依赖项

rs.*_*rs. 6 t-sql sql-server sql-server-2005 views

有没有办法可以找出使用自定义查询或存储过程的视图使用的基表?

Mil*_*dic 11

您可以使用sys.dm_sql_referenced_entities函数查找指定视图引用的对象:

SELECT DISTINCT 
referenced_schema_name , 
referenced_entity_name 
FROM sys.dm_sql_referenced_entities ('Sales.vSalesPersonSalesByFiscalYears', 'OBJECT');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

此外,还有sys.sql_expression_dependencies系统视图,您可以在其中指定表名和引用对象的类型:

SELECT 
referencing_object_name = o.name, 
referencing_object_type_desc = o.type_desc 
FROM sys.sql_expression_dependencies se 
INNER JOIN sys.objects o 
ON se.referencing_id = o.[object_id] 
WHERE referenced_entity_name = 'Person' AND o.type_desc = 'View'
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

为了避免"手动"工作,您还可以使用ApexSQL Clean,这是一个可以找到所有内部和外部依赖项的SQL Server工具.在结果窗格中选择一个对象,并查看依赖于所选对象的所有对象,以及所选对象所依赖的对象:

在此输入图像描述

您还可以过滤对象并可视化依赖项:

在此输入图像描述

免责声明:我作为支持工程师为ApexSQL工作

希望这可以帮助


And*_*mar 7

您可以使用sql_dependencies视图:

select OBJECT_NAME(referenced_major_id) as DependantObject
from sys.sql_dependencies
where object_id = object_id('YourViewName')
Run Code Online (Sandbox Code Playgroud)

以递归方式检索依赖项(例如,如果从视图中选择,则会找到其他视图引用的表):

with deps (child, parent) as (
    select d.object_id, d.referenced_major_id
    from sys.sql_dependencies d
    where d.object_id = object_id('YourViewName')
    union all
    select d.object_id, d.referenced_major_id
    from sys.sql_dependencies d
    inner join deps on deps.parent = d.object_id
)
select OBJECT_NAME(parent)
from deps
Run Code Online (Sandbox Code Playgroud)

这种方法不是万无一失的.例如,如果使用sp_rename重命名对象,则不会更新其依赖项.


Chr*_*oph 2

如果这是您经常做的事情,Red Gate SQL Dependency Tracker(不,我不为他们工作)是一个很棒的工具。我认为如果你想尝试的话他们有一个试用期。