[英]Query for references of a stored procedure in MS SQL Server
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
消息942,第14级,状态4,第231行
Database 'BlahBlahBlah' cannot be opened because it is offline.数据库'BlahBlahBlah'无法打开,因为它处于脱机状态。
Any help getting around this or ideas for tools to search dependencies in SQL Server would be great to know! 任何帮助解决这个问题或想法的工具来搜索SQL Server中的依赖关系将是很好的知道!
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.