如果有一种方法可以在没有正则表达式的情况下执行此操作,那就太棒了。如果没有,这是我到目前为止所得到的:
我编写了一个简单的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_MODULES
列ROUTINE_DEFINITION
而不是INFORMATION_SCHEMA.ROUTINES
{{1}}列的原因是后者仅包含前4000个字符的常规定义,而前者包含全文。
答案 0 :(得分:2)
查看名为SQL Search的免费 Red-Gate工具,它会在整个数据库中搜索任何类型的字符串。
对于任何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