[英]Query for references of a stored procedure in MS SQL Server
我需要在未记录的数据库中搜索所有存储过程的引用。 一些链接被破坏,所以类似下面的内容会抛出错误
SELECT
DB_NAME() AS REFERENCING_DB,
t.SCHEMA_NAME AS REFERENCING_SCHEMA,
t.OBJECT_NAME AS REFERENCING_OBJECT,
t.type_desc AS REFERENCING_TYPE_DESC,
--,'' AS SEPERATOR1
CASE
WHEN ISNULL(ref.referenced_database_name, DB_NAME()) = ''
THEN '?'
ELSE ISNULL(ref.referenced_database_name, DB_NAME())
END AS [REFERENCED_DB],
ref.referenced_schema_name AS REFERENCED_SCHEMA,
ref.referenced_entity_name AS REFERENCED_OBJECT,
ref.referenced_minor_name AS REFERENCED_MINOR_OBJECT,
obj.type_desc AS REFERENCED_TYPE_DESC,
ref.referenced_class_desc AS REFERENCED_CLASS_DESC,
ref.is_caller_dependent AS REFERENCED_IS_CALLER_DEPENDENT
FROM
(SELECT
o.name AS OBJECT_NAME, o.TYPE_DESC, s.name AS SCHEMA_NAME
FROM
sys.objects o
LEFT JOIN
sys.schemas s on o.schema_id = s.schema_id
) t
CROSS APPLY
sys.dm_sql_referenced_entities('[' + t.SCHEMA_NAME + '].[' + t.OBJECT_NAME + ']', 'OBJECT') ref
LEFT JOIN
sys.objects obj ON ref.referenced_id = obj.object_id
错误:
消息942,第14级,状态4,第231行
数据库'BlahBlahBlah'无法打开,因为它处于脱机状态。
任何帮助解决这个问题或想法的工具来搜索SQL Server中的依赖关系将是很好的知道!
目前的工作是快速找到依赖...
------------------------------------------------------------------
--because of the possibility of an object in this database reference a broken link... we have to batch through each object we wish to lookup it's references...
------------------------------------------------------------------
SET NOCOUNT ON;
if OBJECT_ID('tempdb..#ReferencingLookup') is not null
drop table #ReferencingLookup;
CREATE TABLE tempdb..#ReferencingLookup(
[REFERENCING_DB] [nvarchar](1000) NULL,
[REFERENCING_SCHEMA] [nvarchar](1000) NULL,
[REFERENCING_OBJECT] [nvarchar](1000) NULL,
[REFERENCING_TYPE_DESC] [nvarchar](1000) NULL,
[REFERENCED_DB] [nvarchar](1000) NULL,
[REFERENCED_SCHEMA] [nvarchar](1000) NULL,
[REFERENCED_OBJECT] [nvarchar](1000) NULL,
[REFERENCED_MINOR_OBJECT] [nvarchar](1000) NULL,
[REFERENCED_TYPE_DESC] [nvarchar](1000) NULL,
[REFERENCED_CLASS_DESC] [nvarchar](1000) NULL,
[REFERENCED_IS_CALLER_DEPENDENT] [bit] NOT NULL
) ON [PRIMARY]
DECLARE @REFERENCING_SCHEMA varchar(1000), @REFERENCING_OBJECT varchar(1000), @REFERENCING_TYPE_DESC nvarchar(1000);
DECLARE referencing_cursor CURSOR FOR
select distinct REFERENCING_SCHEMA,REFERENCING_OBJECT,REFERENCING_TYPE_DESC
from
(
select
t.SCHEMA_NAME as REFERENCING_SCHEMA
,t.OBJECT_NAME as REFERENCING_OBJECT
,t.type_desc as REFERENCING_TYPE_DESC
FROM
(
select o.name as OBJECT_NAME,o.TYPE_DESC,s.name as SCHEMA_NAME
from sys.objects o
left join sys.schemas s on o.schema_id = s.schema_id
) t
) a
OPEN referencing_cursor
FETCH NEXT FROM referencing_cursor
INTO @REFERENCING_SCHEMA, @REFERENCING_OBJECT, @REFERENCING_TYPE_DESC
declare @ref_type as varchar(1000) = 'OBJECT'
WHILE @@FETCH_STATUS = 0
BEGIN
declare @concat_refs as varchar(1000) = '[' + @REFERENCING_SCHEMA + '].[' + @REFERENCING_OBJECT + ']'
begin try
print @concat_refs
insert into #ReferencingLookup
select
DB_NAME() as REFERENCING_DB
,t.SCHEMA_NAME as REFERENCING_SCHEMA
,t.OBJECT_NAME as REFERENCING_OBJECT
,t.type_desc as REFERENCING_TYPE_DESC
--,'' as SEPERATOR1
,case when isnull(ref.referenced_database_name,DB_NAME()) = '' then '?' else isnull(ref.referenced_database_name,DB_NAME()) end as [REFERENCED_DB]
,ref.referenced_schema_name as REFERENCED_SCHEMA
,ref.referenced_entity_name as REFERENCED_OBJECT
,ref.referenced_minor_name as REFERENCED_MINOR_OBJECT
,obj.type_desc as REFERENCED_TYPE_DESC
,ref.referenced_class_desc as REFERENCED_CLASS_DESC
,ref.is_caller_dependent as REFERENCED_IS_CALLER_DEPENDENT
FROM
(
select o.name as OBJECT_NAME,o.TYPE_DESC,s.name as SCHEMA_NAME
from sys.objects o
left join sys.schemas s on o.schema_id = s.schema_id
where s.name = @REFERENCING_SCHEMA and o.name = @REFERENCING_OBJECT
) t
cross apply sys.dm_sql_referenced_entities(@concat_refs, @ref_type) ref
left join sys.objects obj on ref.referenced_id = obj.object_id
end try
begin catch
select ERROR_MESSAGE();
end catch
FETCH NEXT FROM referencing_cursor
INTO @REFERENCING_SCHEMA, @REFERENCING_OBJECT, @REFERENCING_TYPE_DESC
END
CLOSE referencing_cursor;
DEALLOCATE referencing_cursor;
------------------------------------------------------------------
------------------------------------------------------------------
--peak a boo at the results...
select *
,'[' + REFERENCED_DB +'].[' + REFERENCED_SCHEMA + '].[' + REFERENCED_OBJECT + ']' as REFERENCED_OBJECT_FULLY_SPECIFIED
from #ReferencingLookup
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.