简体   繁体   English

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

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

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