0

我需要检查几个从远程服务器提取数据的存储过程使用的库。

我(在 SO 帮助下,请参阅SO 21708681)构建了以下代码:

DECLARE @tProcs TABLE
    (
        procID int IDENTITY,
        procObjectID nvarchar(100),
        procName nvarchar(100)
    );

insert into @tProcs     
SELECT object_id, name 
    FROM sys.objects 
        WHERE  type in (N'P', N'PC') and name like '%_Extract'

declare @countProcs int, @I int=0

select @countProcs=COUNT(*) from @tProcs

while @I<@countProcs
    Begin
        declare @source_code nvarchar(max)
        declare @objectID nvarchar(50)
        declare @proc_Name nvarchar(200)

        select @objectID=procObjectID from @tProcs where procID=@I
        select @proc_Name=procName from @tProcs where procID=@I

        select @source_code = definition
            from sys.sql_modules
            where object_id = @objectID 

        SELECT PATINDEX('BOCTEST.%', @proc_Name) as Pos, @proc_Name 

              -- or SELECT charindex(@source_code, '%BOCTEST%') 

        set @I=@I+1
    End

在每个目标存储过程中都有这样的一行:

DECLARE YP040P_cursor CURSOR FOR SELECT * FROM BOCTEST.S653C36C.LIVEBOC_A.YP040P

我需要知道每个存储过程的“LIVEBOC_A”部分(可以是“LIVEBOC_A”或LIVEBOC_B)

我尝试使用 PATINDEX 和 CHARINDEX 来获取定义中该字符串的起始 opf 的位置,sysmodules但我得到的只是零或字符串或二进制数据将被截断的错误。

4

2 回答 2

1

尝试

SELECT 
    name, 
    table_name = CASE WHEN OBJECT_DEFINITION(OBJECT_ID) LIKE '%BOCTEST.S653C36C.LIVEBOC_A.YP040P%' THEN 'LIVEBOC_A'
                      WHEN OBJECT_DEFINITION(OBJECT_ID) LIKE '%BOCTEST.S653C36C.LIVEBOC_B.YP040P%' THEN 'LIVEBOC_B' END
FROM sys.objects o
WHERE o.[type] IN ('P', 'PC')
AND name like '%_Extract'
于 2014-02-12T12:34:46.977 回答
1

你可以用这样的查询做你想做的事:

select name         = s.name + '.' + p.name ,
       dt_created   = p.create_date ,
       dt_modified  = p.modify_date ,
       livboc_usage = case
                        when m.definition like '%declare%cursor%boctext.[^.].LIVEBOC_A.%' then 'A'
                        when m.definition like '%declare%cursor%boctext.[^.].LIVEBOC_B.%' then 'B'
                        else null
                      end
from sys.schemas     s
join sys.procedures  p on p.schema_id = s.schema_id
join sys.sql_modules m on m.object_id = p.object_id

但是由于您要查找的是表的跨服务器依赖项,因此您应该能够通过查询系统视图来获得它sys.sql_expression_dependencies,这

对于当前数据库中用户定义实体的每个按名称依赖项包含一行。当一个实体(称为被引用实体)按名称出现在另一个实体(称为引用实体)的持久化 SQL 表达式中时,就会创建两个实体之间的依赖关系。例如,当在视图的定义中引用表时,作为引用实体的视图依赖于被引用实体的表。如果表被删除,视图将不可用。

您可以使用此目录视图报告以下实体的依赖关系信息:

  • 模式绑定实体。
  • 非模式绑定实体。
  • 跨数据库和跨服务器实体。报告实体名称;但是,实体 ID 未解析。
  • 对模式绑定实体的列级依赖。可以使用 sys.dm_sql_referenced_entities 返回非模式绑定对象的列级依赖项。
  • 服务器级 DDL 在主数据库上下文中触发。

为此,在数据库中运行这样的查询,引用存储过程应该这样做:

select name              = o.name      ,
       type              = o.type_desc ,
       liveboc_usage     = case d.referenced_schema_name
                             when 'liveboc_a' then 'A'
                             when 'liveboc_b' then 'B'
                             else                  null
                           end ,
       has_dependency_on =       d.referenced_server_name
                         + '.' + d.referenced_database_name
                         + '.' + d.referenced_schema_name
                         + '.' + d.referenced_entity_name
from sys.sql_expression_dependencies d
join sys.objects                     o on o.object_id = d.referenced_id
join sys.schemas                     s on s.schema_id = o.schema_id
where d.referenced_server_name   =    'BOCTEST'
  and d.referenced_database_name =    'S653C36C'
  and d.referenced_schema_name   like 'LIVEBOC_[AB]'
  and d.referenced_entity_name   =    'YP040P'
于 2014-02-12T19:24:46.567 回答