SQL Server 2008 - 查找特定命令/调用/文本

时间:2010-01-14 14:26:45

标签: c# sql-server sql-server-2008

我需要在特定的表中找到一个insert语句。不幸的是,应用程序不是我的开始,数据库中有超过100个存储过程,我已经逐步完成代码写下每个存储过程名称从开始到结束此过程,我仍然无法找到它。我知道这个过程必须在某个地方发生,因为依赖它的另一个进程可以正常工作。我找不到它。

是否有某种TSQL允许我在多个存储过程中搜索特定的文本行...更具体地说,“INSERT INTO [tablename]”

更新

我尝试过使用:

 SELECT routine_name, routine_type  
 FROM INFORMATION_SCHEMA.ROUTINES  
 WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO [tablename]%' 

直接将[tablename]替换为我的表名。这将返回0行。

我确实有一个带有该行的程序,我会假设它会在上面的查询中返回,但它根本不会带回任何东西。

更新#2

在使用redgate sql搜索工具(使用INSERT INTO [tablename])之后,它返回1 sp,但是我仍然否认这是正确的,因为某些tsql(在sp的末尾丢弃表)仍然在数据库中......)(这是我在sql中的经验所在的地方)

我仍然无法找到这个被调用的地方......

更新#3

我刚刚搜索了'INSERT INTO [tablename]'的整个解决方案,看看他们是否可能不会使用存储过程进行此调用,而且没有...在任何地方找不到它。

7 个答案:

答案 0 :(得分:5)

也可以创建一个存储过程!

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO 

/*
exec sp_find_procs_containing 'insert into tablename'
*/

CREATE PROCEDURE [dbo].[sp_find_procs_containing]    
@search VARCHAR(100) = ''
AS
SET @search = '%' + @search + '%'
SELECT         ROUTINE_NAME,    ROUTINE_DEFINITION
FROM        
INFORMATION_SCHEMA.ROUTINES
WHERE        
ROUTINE_DEFINITION LIKE @search
ORDER BY ROUTINE_NAME

GO

答案 1 :(得分:2)

在应用程序运行时,尝试运行Profiler来捕获执行的查询。要监视的事件是SQL:BatchCompleted,RPC:Completed和SP:StmtCompleted。

另请注意,对于INSERT语句,“INTO”字是可选的,因此也只搜索“INSERT [tablename]”。

答案 2 :(得分:1)

 SELECT routine_name, routine_type 
 FROM INFORMATION_SCHEMA.ROUTINES 
 WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO [tablename]%'

警告:这可能需要一段时间。如果您的系统处于大量生产阶段,请不要在整个表上运行它,而是添加一些额外的条件,一次只搜索一堆存储的例程

编辑:

也许你应该尝试别的东西。对所有例程进行文本转储,并使用grep进行搜索。我相信你可以获得grep for windows。使用管理工作室轻松完成转储:导航到数据库,右键单击,然后选择任务>生成脚本。

答案 3 :(得分:1)

尝试

SELECT * FROM sys.syscomments
WHERE text LIKE '%CREATE PROCEDURE%'
AND text LIKE '%INSERT INTO%'

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO%' 
AND ROUTINE_TYPE='PROCEDURE'

第二个发现here

答案 4 :(得分:1)

只是为了添加我之前不会重复的答案,我认为将所有数据库对象编写脚本(并保存在源代码管理中)是个好主意。所以我想补充一句就是你用一块石头杀死2只鸟 - 脚本数据库,然后搜索生成的sql脚本。

答案 5 :(得分:1)

看看这个红门工具:sql search仍处于测试阶段,但它应该可以正常工作

答案 6 :(得分:1)

您可能在其中有一些LFCR/LF或额外的空格,阻止您的搜索工作。减少搜索字符串,直到获得匹配(例如,尝试使用表名),或将其更改为:%INSERT%SOMETHING%INTO%SOMETHING%等。