从存储的proc定义中提取字符串

时间:2014-02-12 09:59:59

标签: sql sql-server-2008-r2 substring patindex charindex

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

我(有了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从sysmodules获取定义中起始opf字符串的位置,但我得到的所有内容都是零或者字符串或二进制数据将被截断的错误。< / p>

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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在master数据库的上下文中触发。
  •   

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

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'