Sql server 能否搜索SQL Server 2005存储过程内容?

Sql server 能否搜索SQL Server 2005存储过程内容?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,SQLServer2005。我盯着一个有500多个存储过程的数据库,试图收集它们如何与数据交互的复杂性,特别是它们如何插入/修改数据。我希望找到一个搜索或查找功能,可以查看实际过程的内容。这样,我就可以搜索所有使用某个表名执行任何操作的过程。SQL Management Studio的基本查找功能在打开的文件中查找,而在文件中查找仅在存储过程已打开时才显示为查找内容,甚至仅在…\Local Settings\Temp\~vs1011.SQL临时类型文件中显示 到目前为止,我所知道的进入底层过程的

SQLServer2005。我盯着一个有500多个存储过程的数据库,试图收集它们如何与数据交互的复杂性,特别是它们如何插入/修改数据。我希望找到一个搜索或查找功能,可以查看实际过程的内容。这样,我就可以搜索所有使用某个表名执行任何操作的过程。SQL Management Studio的基本查找功能在打开的文件中查找,而在文件中查找仅在存储过程已打开时才显示为查找内容,甚至仅在…\Local Settings\Temp\~vs1011.SQL临时类型文件中显示


到目前为止,我所知道的进入底层过程的唯一方法是右键单击并选择modify或Script Storage procedure As=>Create或Alter。是否有一种更快/更简单的方法来搜索/检查所有存储过程?

批量导出到文本文件,然后使用Google Desktop为其编制索引。

有一个信息模式。例程视图可供使用

select * 
FROM   INFORMATION_SCHEMA.ROUTINES 
WHERE  OBJECTPROPERTY(OBJECT_ID(SPECIFIC_NAME),'IsMSShipped') =0 
       and OBJECT_DEFINITION(OBJECT_ID(SPECIFIC_NAME)) like '%search term here%' 
       AND ROUTINE_TYPE='PROCEDURE'

您还可以找到sp_grep,这是一个流行的但未包括在内的执行此操作的过程。

使用INFORMATION_SCHEMA.ROUTINES表

SELECT DISTINCT OBJECT_NAME(id) AS ObjectName, [Text] AS CodeSnippet 
FROM syscomments (nolock) 
WHERE [TEXT] LIKE '%Whatever You Want To Search For%'
在该表中,例程定义字段包含存储过程的文本

SELECT
  R.SPECIFIC_NAME
 ,R.ROUTINE_DEFINITION
FROM
  MyDatabase.INFORMATION_SCHEMA.ROUTINES R
WHERE UPPER(R.ROUTINE_DEFINITION) LIKE '%' + UPPER('DELETE') + '%'
当然,您可以参数化我硬编码单词DELETE的位置。在SQL Server 2005中测试。

您可以从sys.syscomments中选择*

如果你有VS数据库专业版。您可以新建数据库项目,从数据库导入架构,并在项目中进行搜索


如果你想要一个友好的界面,我可以推荐Idera提供的便宜的。除了其他工具外,它还有一个很好的SQL搜索实用程序,可以在存储过程或其他任何地方查找字符串,并帮助您导航这些字符串。

使用MS SQL Server Management Studio

select o.name 
from syscomments c
    inner join sysobjects o on c.id = o.id
where text like '%tableName%'
在TreeView中查找表或SP,右键单击它并选择View dePendencies


这样,您就可以看到所有依赖对象。

不要使用信息\u SCHEMA.ROUTINES。它在4000个字符处截断。改为从sys.sql\u模块获取

SELECT o.type_desc AS ROUTINE_TYPE
        ,o.[name] AS ROUTINE_NAME
        ,m.definition AS ROUTINE_DEFINITION
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
    ON m.object_id = o.object_id
WHERE m.definition LIKE '%search term here%'

如前所述,这还将返回触发器、视图和标量函数。如果需要,请按类型排除这些存储过程。

我使用我不久前遇到的以下存储过程:

 CREATE PROC dbo.sp_search_code  
(  
@SearchStr  varchar(100),  
@RowsReturned int = NULL OUT  
)  
AS  
/*************************************************************************************************  
  Copyright © 1997 - 2002 Narayana Vyas Kondreddi. All rights reserved.  

Purpose: To search the stored proceudre, UDF, trigger code for a given keyword.  

Written by: Narayana Vyas Kondreddi  
  http://vyaskn.tripod.com  

Tested on:  SQL Server 7.0, SQL Server 2000  

Date created: January-22-2002 21:37 GMT  

Date modified: February-17-2002 19:31 GMT  

Email:   vyaskn@hotmail.com  

Examples:  

To search your database code for the keyword 'unauthorized':  
EXEC sp_search_code 'unauthorized'  

To search your database code for the keyword 'FlowerOrders' and also find out the number of hits:  
DECLARE @Hits int  
EXEC sp_search_code 'FlowerOrders', @Hits OUT  
SELECT 'Found ' + LTRIM(STR(@Hits)) + ' object(s) containing this keyword' AS Result  
*************************************************************************************************/  
BEGIN  
 SET NOCOUNT ON  

 SELECT DISTINCT USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) AS 'Object name',  
  CASE   
    WHEN OBJECTPROPERTY(c.id, 'IsReplProc') = 1   
    THEN 'Replication stored procedure'  
    WHEN OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1   
    THEN 'Extended stored procedure'      
   WHEN OBJECTPROPERTY(c.id, 'IsProcedure') = 1   
    THEN 'Stored Procedure'   
   WHEN OBJECTPROPERTY(c.id, 'IsTrigger') = 1   
    THEN 'Trigger'   
   WHEN OBJECTPROPERTY(c.id, 'IsTableFunction') = 1   
    THEN 'Table-valued function'   
   WHEN OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1   
    THEN 'Scalar-valued function'  
    WHEN OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1   
    THEN 'Inline function'   
  END AS 'Object type',  
  'EXEC sp_helptext ''' + USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) + '''' AS 'Run this command to see the object text'  
 FROM syscomments c  
  INNER JOIN  
  sysobjects o  
  ON c.id = o.id  
 WHERE c.text LIKE '%' + @SearchStr + '%' AND  
  encrypted = 0    AND  
  (  
  OBJECTPROPERTY(c.id, 'IsReplProc') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsProcedure') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsTrigger') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsTableFunction') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1   
  )  

 ORDER BY 'Object type', 'Object name'  

 SET @RowsReturned = @@ROWCOUNT  
END  

与上述答案完全不同的方法是编写一个简单的程序,使用Microsoft.SqlServer.Management.Smo和Microsoft.SqlServer.Management.Common命名空间。使用这些,您可以迭代所有存储过程并从中读取文本。我以这种方式编写了一个程序,用于比较两个不同数据库中的存储过程:dev和stage或stage和production,并更新不同的存储过程

以下是一个例子:

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace SqlObjectChecker
{
    internal class ProcedureUpdater
    {
        internal string UpdateProcedure(string spName, string devConnString, string prodConnString, bool updateDev)
        {
            string returnMessage = "";

            ServerConnection devConnection = new ServerConnection();
            devConnection.ConnectionString = devConnString;
            ServerConnection prodConnection = new ServerConnection();
            prodConnection.ConnectionString = prodConnString;

            try
            {
                devConnection.Connect();
                prodConnection.Connect();

                Server devServer = new Server(devConnection);
                Server prodServer = new Server(prodConnection);

                Database devDatabase = devServer.Databases["Dbname"];
                Database prodDatabase = prodServer.Databases["Dbname"];

                StoredProcedure devStoredProcedure = devDatabase.StoredProcedures[spName];
                if (devStoredProcedure != null)
                {
                    StoredProcedure prodStoredProcedure = prodDatabase.StoredProcedures[spName];
                    if (prodStoredProcedure != null)
                    {
                        if (updateDev)
                        {
                            devStoredProcedure.TextHeader = prodStoredProcedure.TextHeader;
                            devStoredProcedure.TextBody = prodStoredProcedure.TextBody;
                            devStoredProcedure.Alter();
                            returnMessage = "Dev updated";
                        }
                        else
                        {
                            prodStoredProcedure.TextHeader = devStoredProcedure.TextHeader;
                            prodStoredProcedure.TextBody = devStoredProcedure.TextBody;
                            prodStoredProcedure.Alter();
                            returnMessage = "Prod updated.";
                        }
                    }
                    else
                    {
                        returnMessage = "Prod Stored Procedure Name Found.";
                    }
                }
                else
                {
                    returnMessage = "Dev Stored Procedure Name Found.";
                }

                devConnection.Disconnect();
                prodConnection.Disconnect();
            }
            catch (Exception exception)
            {
                returnMessage = exception.Message;
            }

            return returnMessage;
        }
    }
}

我编写了一个Perl模块,它允许我这样做,甚至更多。有了它,我可以使用SQL语句操作视图/存储过程和Perl代码/usr/bin/perl

使用代码库

严格使用; 使用警告

Codebase::CreateFunctions(change=>\&change);

exit;
子变更{ 我的$string=shift

my %H=(
        23 => 30,
        25 => 26,
        27 => 30,
        28 => 30,
        29 => 30,
        31 => 24,
        32 => 24
         );
$string =~ s/InstallStatus *(<>|==|>=|<=|>|=|<) *(23|25|27|28|29|31|32)(\W)/"iNstallsTatus $1 $H{$2}$3"/iges;
return $string;
 } # change
结束 选择nameentries.fullname | | extensionentries.fullname作为名称,grepm/\W23 | 25 | 27 | 28 | 29 | 31 | 32 | InstallStatusNew | InstallStatusOld\W/,objects.definition,如清单3所示 从条目 entries.OId=objects.OId上的内部联接对象 其中“BETA:/”中的pathentries.fullname和“entries.kind=”view“ 和objects.definition,如m/\W跟踪\W/和objects.definition,如m/\WInstallStatus\W |\s/ 或objects.definition,如m/\WTRACKING_LOG\W/和objects.definition,如m/\WInstallStatusNew | OLD\W |\s/ 限制10

select name(entries.fullname)||extension(entries.fullname) as Name, change(objects.definition) as FILE
    from entries
    inner join objects on entries.OId = objects.OId
    where (path(entries.fullname) in ('BETA:/') and entries.kind = 'view')
        and (((objects.definition like m/\W(TRACKING)\W/) and (objects.definition like m/\WInstallStatus(\W|\s)/))
        or ((objects.definition like m/\W(TRACKING_LOG)\W/) and (objects.definition like m/\WInstallStatus(New|OLD)(\W|\s)/)))
        and (change(objects.definition) <> objects.definition)
limit 10

`

RedGate的SQL搜索产品可以轻松处理这一问题,而且是免费的。

尝试使用第三方工具,如free或SSMS Toolpack free,这些工具与前面提到的工具不同


我在过去继承500多个对象数据库时也遇到过类似的问题。我的经验是,查询是可以的,但真正有帮助的是第三方SSMS插件。

在此处输入您的进程名,其中显示Place proc name


sp_msforeachdb'SELECT DISTINCT o.name,o.xtype FROM?.dbo.syscomments c internal JOIN?.dbo.sysobjects o ON c.id=o.id,其中c.TEXT如%Place Proc name Here%'

正如我喜欢SQL Server一样,Microsoft确实不能对存储过程给予太高的评价,因为它们只为您提供使用它们所需的最低功能问题,我希望能够将它们组织到虚拟文件夹中,并具有内置版本控制等。同意。即使只是能够将它们作为公共界面或专用库的一部分直观地分开也会有所帮助。这不是一个坏主意,但每次存储过程更改时,您必须小心刷新本地文本副本。不重新由于syscomments会将定义存储在多行上,因此已修复。如果proc的长度超过一行中的fir长度,您也可以执行此操作,从信息中选择*\u SCHEMA.ROUTINES WHERE OBJECT
PROPERTYOBJECT_IDSPECIFIC_NAME、'IsMSShipped'=0和OBJECT_DEFINITIONOBJECT_IDSPECIFIC_NAME,如“%search term here%”和例程_TYPE='PROCEDURE',对于少于4000个字符的任何对象都可以正常工作。如果存储的进程较长,则需要使用sys.sql\u modules.sp\u dependens不可靠,请阅读此信息\u Schema.Routines限制为4000个字符。如果您知道存储的进程比这个长,那么请改用sys.sql\u模块。使用此工具,生活会轻松得多!
select name(entries.fullname)||extension(entries.fullname) as Name, change(objects.definition) as FILE
    from entries
    inner join objects on entries.OId = objects.OId
    where (path(entries.fullname) in ('BETA:/') and entries.kind = 'view')
        and (((objects.definition like m/\W(TRACKING)\W/) and (objects.definition like m/\WInstallStatus(\W|\s)/))
        or ((objects.definition like m/\W(TRACKING_LOG)\W/) and (objects.definition like m/\WInstallStatus(New|OLD)(\W|\s)/)))
        and (change(objects.definition) <> objects.definition)
limit 10