【问题标题】:How can I do a search of the text of all Stored Procedures in a SQL database如何在 SQL 数据库中搜索所有存储过程的文本
【发布时间】:2013-03-19 20:46:25
【问题描述】:

在 Visual Studio 2k8 中,我按下 Ctrl-F,然后键入一些我想在我的项目中搜索的文本。我可以一次快速搜索多个文件。

我有一个带有一些存储过程的 SQL Server。如何轻松地在存储过程中搜索任意字符串?我知道我可以在 SQL Server Studio 中列出一个存储过程的文本并从那里进行 Ctrl-F 搜索,但我想一次搜索它们。

【问题讨论】:

    标签: sql search ssms


    【解决方案1】:

    SQL Search(来自 Redgate)是你的朋友。免费下载,直接集成到 SSMS 中:)

    【讨论】:

      【解决方案2】:

      这会搜索所有视图、过程和用户​​定义的函数:

      CREATE PROCEDURE usp_SearchFor
          @PatternIn AS varchar(max)
         ,@ObjectNamePattern AS varchar(max) = NULL
      AS 
      BEGIN
          DECLARE @Pattern AS varchar(max)
          SET @Pattern = '%' + @PatternIn + '%' ;
          WITH    ROUTINES
                    AS (
                        -- CANNOT use INFORMATION_SCHEMA.ROUTINES because of 4000 character limit
              SELECT  o.type_desc AS ROUTINE_TYPE
                         ,s.[name] AS [SCHEMA_NAME]
                         ,o.[name] AS ROUTINE_NAME
                         ,m.definition AS ROUTINE_DEFINITION
                  FROM    sys.sql_modules AS m WITH (NOLOCK)
                  INNER JOIN sys.objects AS o WITH (NOLOCK)
                          ON m.[object_id] = o.[OBJECT_ID]
                  INNER JOIN sys.schemas AS s WITH (NOLOCK)
                          ON s.[schema_id] = o.[schema_id]
                  WHERE   m.definition LIKE @Pattern
                       ),
                  Results
                    AS (
                        SELECT    ROUTINE_TYPE
                                 ,[SCHEMA_NAME]
                                 ,ROUTINE_NAME
                                 ,PATINDEX(@Pattern, ROUTINE_DEFINITION) AS StartPos
                                 ,SUBSTRING(ROUTINE_DEFINITION,
                                            PATINDEX(@Pattern, ROUTINE_DEFINITION),
                                            255) AS WorkItem
                                 ,RIGHT(ROUTINE_DEFINITION,
                                        LEN(ROUTINE_DEFINITION) - PATINDEX(@Pattern, ROUTINE_DEFINITION)) AS Remainder
                                 ,1 AS Occurrence
                        FROM      ROUTINES
                        UNION ALL
                        SELECT    ROUTINE_TYPE
                                 ,[SCHEMA_NAME]
                                 ,ROUTINE_NAME
                                 ,PATINDEX(@Pattern, Remainder) AS StartPos
                                 ,SUBSTRING(Remainder, PATINDEX(@Pattern, Remainder),
                                            255) AS WorkItem
                                 ,RIGHT(Remainder,
                                        LEN(Remainder) - PATINDEX(@Pattern,
                                                                  Remainder)) AS Remainder
                                 ,Occurrence + 1 AS Occurrence
                        FROM      Results
                        WHERE     PATINDEX(@Pattern, Remainder) > 0
                       )
              SELECT  'Search For:' + @PatternIn AS Problem
                     ,ROUTINE_TYPE
                     ,QUOTENAME([SCHEMA_NAME]) + '.' + QUOTENAME([ROUTINE_NAME]) AS ROUTINE_NAME
                     ,WorkItem
              FROM    Results
              WHERE   @ObjectNamePattern IS NULL
                      OR ROUTINE_NAME LIKE @ObjectNamePattern
              ORDER BY ROUTINE_TYPE
                     ,[SCHEMA_NAME]
                     ,ROUTINE_NAME
                     ,Occurrence
      END
      

      【讨论】:

        【解决方案3】:

        存储的 proc 文本存储在 sysobjects、syscmets 中。

        Example

        【讨论】:

          【解决方案4】:

          只需将所有 proc 脚本写入一个查询窗口。然后 ctrl-f 让你心满意足。

          【讨论】:

            【解决方案5】:
            SELECT DISTINCT OBJECT_NAME(ID) FROM SysComments WHERE Text LIKE '%Search%'
            

            显然已弃用,但在 SQL 2008 中仍然有效

            【讨论】:

              【解决方案6】:

              您可以使用下面的简单搜索

              select ROUTINE_name from INFORMATION_SCHEMA.ROUTINES
              where CHARINDEX('demo',routine_definition,1)>0
              

              用你的任意字符串替换'demo'

              【讨论】:

              • 在我的服务器上运行此代码返回错误消息:The multi-part identifier "dbo.procName" could not be bound.
              猜你喜欢
              • 1970-01-01
              • 2013-01-20
              • 1970-01-01
              • 1970-01-01
              • 2017-02-20
              • 1970-01-01
              • 2012-10-19
              • 2011-06-29
              • 1970-01-01
              相关资源
              最近更新 更多