如何查找从特定表中删除行的所有存储过程

时间:2011-06-01 19:19:26

标签: regex sql-server-2005

如果有一种方法可以在没有正则表达式的情况下执行此操作,那就太棒了。如果没有,这是我到目前为止所得到的:

我编写了一个简单的CLR用户定义函数(正如您所见,我称之为CLR_RegExMatch),它在提供的字符串上执行正则表达式匹配。我用它来搜索存储过程,触发器,函数等中的模式。

以下是其使用示例 - 在名为ExampleTable的表中搜索插入:

SELECT O.name, O.type_desc
FROM
    SYS.OBJECTS O
    INNER JOIN SYS.SQL_MODULES M ON 
        M.object_id = O.object_id
        AND dbo.CLR_RegExMatch('INSERT\s+(INTO\s+)?ExampleTable\b', M.definition) = 1

我遇到的问题是我无法提出正则表达式模式来查找从给定表中删除行的所有例程。显然,我可以将以下内容替换为上一个示例中的最后一行:

        AND dbo.CLR_RegExMatch('DELETE\s+(FROM\s+)?ExampleTable\b', M.definition) = 1

这让我成为那里的一部分。但是它不会接受以下内容:

DELETE T1
FROM
    ExampleTable T1
    INNER JOIN AnotherTable T2 ON T2.ParentId = T1.Id

所以我正在寻找的是一个与上面的删除匹配的正则表达式模式,或者另外一种不同的方式。

<小时/> 注:我查询definition SYS.SQL_MODULESROUTINE_DEFINITION而不是INFORMATION_SCHEMA.ROUTINES {{1}}列的原因是后者仅包含前4000个字符的常规定义,而前者包含全文。

2 个答案:

答案 0 :(得分:2)

查看名为SQL Search免费 Red-Gate工具,它会在整个数据库中搜索任何类型的字符串。

enter image description here

enter image description here

对于任何DBA或数据库开发人员来说,这是一个非常必备的工具 - 我是否已经提到它绝对免费用于任何用途?

它不会告诉你哪些程序实际上删除表中的某些东西 - 但是它将非常容易且很好地找到以任何方式引用该表的所有过程。看看那些,找到你需要的那些!

答案 1 :(得分:0)

如果可以提供帮助,我使用这个可以在数据库/ s

中的所有模块中找到字符串的存储过程

用法:

exec find_text 'text to search', 'db_name' 
-- if no db_name specified search in all DB

以下代码:

CREATE PROCEDURE [dbo].[find_text]  
@text varchar(250),  
@dbname varchar(64) = null  
AS BEGIN  
SET NOCOUNT ON;  

if @dbname is null  
 begin  
  -- enumerate all databases.  
  DECLARE #db CURSOR FOR Select Name from master..sysdatabases  
  declare @c_dbname varchar(64)  

  OPEN #db FETCH #db INTO @c_dbname  
  while @@FETCH_STATUS <> -1   
  begin  
    execute find_text @text, @c_dbname  
    FETCH #db INTO @c_dbname  
  end    
  CLOSE #db DEALLOCATE #db  
 end 
else  
 begin 
    declare @sql varchar(250)  
    --create the find like command  
    select @sql = 'select ''' + @dbname + ''' as db, o.name,m.definition '  
    select @sql = @sql + ' from '+@dbname+'.sys.sql_modules m '  
    select @sql = @sql + ' inner join '+@dbname+'..sysobjects o on m.object_id=o.id'  
    select @sql = @sql + ' where [definition] like ''%'+@text+'%'''
    select @sql = @sql + ' order by o.name'  

    execute (@sql)  
 end   
END