繁体   English   中英

查询MS SQL Server中存储过程的引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM