I need to search for the references of all stored procedures in an undocumented database. Some of the links are broken so something like the below will throw errors
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
Error:
Msg 942, Level 14, State 4, Line 231
Database 'BlahBlahBlah' cannot be opened because it is offline.
Any help getting around this or ideas for tools to search dependencies in SQL Server would be great to know!
Current work around for quickly finding dependencies...
------------------------------------------------------------------
--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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.