SQL Server如何找出视图依赖的对象和视图嵌套层数
Tags: MSSQLSQL Server依赖视图
场景1
在SQL Server数据库的SQL优化中,我们有时候会需要找出某个视图的依赖对象,简单的视图倒是很容易一眼就找出依赖对象,一旦遇到一些复杂的视图,如果我们手动整理的话,就相当麻烦了,因为你要一个对象一个对象的捋一遍。相当的耗时耗力,其实这种机械、重复、繁杂的事情就应该让机器(SQL)去处理。我们应该将精力和时间用在关键的地方。所谓好钢要用在刀刃上。所以最好能用一个SQL将视图依赖的对象全部查询出来。
下面是我写的一个脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | /*-************************************************************************************************************* --脚本名称 : get_view_referenced_objects.sql --脚本作者 : 潇湘隐者 --创建日期 : 2018-06-28 *************************************************************************************************************** 脚本功能 : 查看View引用/依赖的对象 *************************************************************************************************************** 注意事项 : 1:执行前修改参数@object_name的值 *************************************************************************************************************** 脚本参数 : @object_name 按实际情况填写对应的视图名称 *************************************************************************************************************** 参考资料 : 无 *************************************************************************************************************** 更新记录 : 2018-06-28 创建此脚本 2022-01-06 修改脚本,如果被引用的对象不是跨数据库或跨服务器的对象, 那么server_name,database_name为null,修改脚本逻辑。 *-**************************************************************************************************************/ declare @object_name varchar(128) set @object_name = 'dbo.v_SecPolicyInfo' ;WITH cte_objects AS ( SELECT 1 as nested_level ,d.referencing_id ,d.referenced_id ,d.referenced_server_name ,d.referenced_database_name ,d.referenced_class_desc ,d.referenced_schema_name ,d.referenced_entity_name FROM sys.sql_expression_dependencies d WHERE d.referencing_id = object_id(@object_name) UNION ALL SELECT t.nested_level+1 nested_level ,d.referencing_id ,d.referenced_id ,d.referenced_server_name ,d.referenced_database_name ,d.referenced_class_desc ,d.referenced_schema_name ,d.referenced_entity_name FROM sys.sql_expression_dependencies d INNER JOIN cte_objects t ON t.referenced_id = d.referencing_id ) SELECT d.nested_level , schema_name(o.schema_id) +'.' + o.name as object_name , o.type_desc , ISNULL(d.referenced_server_name,@@SERVERNAME) as referenced_server_name , ISNULL(d.referenced_database_name, DB_NAME()) as referenced_database_name , d.referenced_class_desc , ISNULL(d.referenced_schema_name,'dbo') + '.' +d.referenced_entity_name as referenced_entity_name , p.type_desc as referenced_object_type FROM cte_objects d INNER JOIN sys.objects o ON d.referencing_id = o.object_id INNER JOIN sys.objects p ON d.referenced_id = p.object_id ; |