我需要在特定的表中找到一个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]'的整个解决方案,看看他们是否可能不会使用存储过程进行此调用,而且没有...在任何地方找不到它。
答案 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)
您可能在其中有一些LF
,CR/LF
或额外的空格,阻止您的搜索工作。减少搜索字符串,直到获得匹配(例如,尝试使用表名),或将其更改为:%INSERT%SOMETHING%INTO%SOMETHING%
等。