Как я могу сделать поиск текста всех хранимых процедур в базе данных SQL - PullRequest
2 голосов
/ 19 июня 2010

В Visual Studio 2k8 я нажимаю Ctrl-F и затем набираю текст, который хочу найти в своем проекте. Я могу быстро искать много файлов одновременно.

У меня есть SQL Server с некоторыми хранимыми процедурами. Как я могу легко найти в моих хранимых процедурах произвольные строки? Я знаю, что могу перечислить текст одной хранимой процедуры в SQL Server Studio и выполнить поиск по Ctrl-F оттуда, но я хочу найти их все сразу.

Ответы [ 6 ]

7 голосов
/ 19 июня 2010

SQL Search (от Redgate) - ваш друг.Скачать бесплатно, интегрируется прямо в SSMS:)

4 голосов
/ 19 июня 2010

Поиск всех представлений, процедур и пользовательских функций:

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
2 голосов
/ 19 июня 2010

Сохраненный текст процесса хранится в системных объектах, системных комментариях.

* ** 1003 тысяча два * Пример
1 голос
/ 19 июня 2010
SELECT DISTINCT OBJECT_NAME(ID) FROM SysComments WHERE Text LIKE '%Search%'

По-видимому, устарел, но все еще работает в SQL 2008

1 голос
/ 19 июня 2010

Просто запишите все процы в окно запроса. Тогда Ctrl-F к содержанию вашего сердца.

0 голосов
/ 19 июня 2010

Вы можете использовать простой поиск, как показано ниже:

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

замените произвольную строку на 'demo'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...