Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server 2008-查找特定命令/调用/文本_C#_Sql Server_Sql Server 2008 - Fatal编程技术网

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

C# SQL Server 2008-查找特定命令/调用/文本,c#,sql-server,sql-server-2008,C#,Sql Server,Sql Server 2008,我需要在特定的表中找到insert语句。不幸的是,这个应用程序并不是我的,数据库中有100多个存储过程,我在代码中从头到尾写下了每个存储过程的名称,但仍然找不到它。我知道这个过程必须发生在某个地方,因为依赖它的另一个过程可以正常工作。我就是找不到 是否有某种TSQL允许我在多个存储过程中搜索特定的文本行。。。更具体地说,“插入到[表名]” 更新 我试过使用: SELECT routine_name, routine_type FROM INFORMATION_SCHEMA.ROUTINE

我需要在特定的表中找到insert语句。不幸的是,这个应用程序并不是我的,数据库中有100多个存储过程,我在代码中从头到尾写下了每个存储过程的名称,但仍然找不到它。我知道这个过程必须发生在某个地方,因为依赖它的另一个过程可以正常工作。我就是找不到

是否有某种TSQL允许我在多个存储过程中搜索特定的文本行。。。更具体地说,“插入到[表名]”

更新

我试过使用:

 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]”,看看他们是否没有为这个调用使用存储过程,什么都没有。。。到处都找不到

 SELECT routine_name, routine_type 
 FROM INFORMATION_SCHEMA.ROUTINES 
 WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO [tablename]%'
警告:这可能需要一段时间。如果您的系统处于大量生产使用中,不要在整个表上运行它,而是添加一些额外的条件,一次只搜索一组存储的例程

编辑: 也许你应该试试别的。对所有例程进行文本转储,并使用grep进行搜索。我相信你能得到一份工作。使用management studio可以轻松完成转储:导航到数据库,右键单击,然后选择任务>生成脚本。

试试看

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


第二个发现

只是为了补充前面的答案,我不想重复,我认为编写所有数据库对象的脚本(并保存在源代码管理中)是一个好主意。因此,我建议您一石二鸟——为数据库编写脚本,然后搜索生成的sql脚本。

也用它创建一个存储过程

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

看看这个红门工具:仍然是测试版,但它应该可以工作

你可能有一些
LF
CR/LF
或者额外的空间在那里阻止你的搜索工作。减少搜索字符串,直到找到匹配项为止(例如,尝试仅使用表名),或将其更改为:
%INSERT%SOMETHING%到%SOMETHING%
,等等。

当应用程序运行时,尝试运行探查器以捕获执行的查询。要监视的事件有SQL:BatchCompleted、RPC:Completed和SP:StmtCompleted


还请注意,INSERT语句中的“INTO”字是可选的,因此也可以只搜索“INSERT[tablename]”

您也应该检查触发器,此插入可能是从触发器执行的,这是我检查的第一件事之一。。。没有触发器。可能应该在原始问题中指出这一点。为了验证是否找到了正确的过程,请将RAIESERROR语句插入到正文中,重新编译该过程,并查看在执行操作时是否会弹出您自己的错误,这是正确的过程。测试完成时不要忘记删除raiserror语句。MSDN上RAIESERROR语句的说明:例如,raiseerror('Found!',18,111)尝试搜索不带“insert into”字符串的[tablename]解决方案-它可以动态构造,或者客户端代码可以在insert操作中使用表对象。请注意,如果使用方括号,则需要对其进行转义,例如:'%insert into'|[tablename |]%'ESCAPE'|'。除非方括号只是用来突出显示它作为实际表名的占位符:)奇怪的是,它甚至没有返回我能够找到的包含调用的1过程。不幸的是,在此过程中没有调用sp。你的意思是它们返回了0行吗?正确…它们是“工作”…但没有返回我需要的,所以他们没有“工作”"对于me>它会找到表名的一个实例…从中提取信息的SELECT,但它没有找到将信息放入其中的INSERT。您如何知道
INSERT
语句在数据库中,而不是来自访问数据库的应用程序?没有其他应用程序访问它数据库,而不是我正在处理的应用程序。此进程的所有sql都包含在存储过程中。您如何确定此语句正在运行?此进程之后发生的过程无法运行,除非此表中有数据。非常棒的工具,tyvm它可以非常快地返回信息但是,它运行的是一个完全不同的进程,实际上是在进行计算……即使是单步执行,我也不确定它从.net方面是如何工作的……我认为它与一个子报表有关,该子报表直接链接到数据库中的存储过程……我现在更新了另一个进程及其工作方式。
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