2011-06-01 122 views
0

如果有一种不使用正则表达式的方法,那太棒了。如果没有,这里是我到目前为止:如何查找从特定表中删除行的所有存储过程

我已经写了一个简单的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 

所以,我正在寻找的是要么将匹配一个正则表达式模式如上删除,或者要去这个以不同的方式。


N.B.我查询 definition列的原因是 SYS.SQL_MODULES而不是 ROUTINE_DEFINITIONINFORMATION_SCHEMA.ROUTINES是因为后者只包含前4000个字符的例程定义,而前者包含全文。

回答

2

看一看免费红色的工具叫做SQL Search它这样做 - 它会搜索你的整个数据库中的任何一种字符串。

enter image description here

enter image description here

这是一个伟大的必须具备的任何DBA或数据库开发人员工具 - 为什么我已经提到它的绝对免费用于任何用途的?

它不会告诉你实际上哪些程序删除东西从表中 - 但它会很容易和很好地找到所有引用该表的程序。看看这些,找到你需要的!

+0

作为解释在我的问题中,我已经从CLR正则表达式函数和系统表的组合中为您提供了该工具的所有功能。但是我猜你写的东西可能对不愿意查询系统表或编写CLR函数的人有用。也是一个不错的搜索引擎优化提升为开发者! – aslant 2011-06-02 09:33:53

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 '[email protected]+'.sys.sql_modules m ' 
    select @sql = @sql + ' inner join '[email protected]+'..sysobjects o on m.object_id=o.id' 
    select @sql = @sql + ' where [definition] like ''%'[email protected]+'%''' 
    select @sql = @sql + ' order by o.name' 

    execute (@sql) 
end 
END 
+0

谢谢,但这并没有让我更接近答案。正如所解释的,我有一个很好的方式来搜索存储过程中的文本模式,触发器等。 – aslant 2011-06-02 09:35:37

+0

我给你的例子**搜索所有存储过程,触发器,用户函数,... **无论在数据库中,试一试并检查它: 'exec find_text'DELETE ExampleTable','your_db_name'' – 2011-06-02 09:53:51

+0

我给你的例子完全一样,但更好!有关更多信息,请参见[SYS.SQL_MODULES上的MSDN文档](http://msdn.microsoft.com/zh-cn/library/ms175081.aspx)。 – aslant 2011-06-02 10:27:16

相关问题