Как найти хранимую процедуру, содержащую <text>? - PullRequest
287 голосов
/ 22 февраля 2011

Мне нужно найти в SQL Server 2008 хранимые процедуры, содержащие, где возможно имя поля базы данных или имя переменной.

Ответы [ 20 ]

507 голосов
/ 22 февраля 2011
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION LIKE '%Foo%' 
    AND ROUTINE_TYPE='PROCEDURE'

SELECT OBJECT_NAME(id) 
    FROM SYSCOMMENTS 
    WHERE [text] LIKE '%Foo%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)

SELECT OBJECT_NAME(object_id)
    FROM sys.sql_modules
    WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
    AND definition LIKE '%Foo%'
75 голосов
/ 22 февраля 2011

Получите копию бесплатного Red-Gate SQL Search инструмента и начните наслаждаться поиском в SQL Server! : -)

enter image description here

Это отличный и очень полезный инструмент, и ДА! это абсолютно БЕСПЛАТНО для любого использования.

36 голосов
/ 28 февраля 2013

Вы также можете попробовать ApexSQL Search - бесплатный плагин SSMS от ApexSQL.

enter image description here

26 голосов
/ 20 октября 2014

Я взял ответ Кашифа и соединил их всех вместе.Странно, иногда я находил результаты в одном из выборов, но не в другом.Поэтому, чтобы быть в безопасности, я запускаю все 3, когда что-то ищу.Надеюсь, это поможет:

DECLARE @SearchText varchar(1000) = 'mytext';

SELECT DISTINCT SPName 
FROM (
    (SELECT ROUTINE_NAME SPName
        FROM INFORMATION_SCHEMA.ROUTINES 
        WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%' 
        AND ROUTINE_TYPE='PROCEDURE')
    UNION ALL
    (SELECT OBJECT_NAME(id) SPName
        FROM SYSCOMMENTS 
        WHERE [text] LIKE '%' + @SearchText + '%' 
        AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
        GROUP BY OBJECT_NAME(id))
    UNION ALL
    (SELECT OBJECT_NAME(object_id) SPName
        FROM sys.sql_modules
        WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
        AND definition LIKE '%' + @SearchText + '%')
) AS T
ORDER BY T.SPName
10 голосов
/ 15 ноября 2012

Если вам нужна также схема:

SELECT   DISTINCT SCHEMA_NAME(o.schema_id),o.name,[text]
FROM     syscomments AS c
         INNER JOIN sys.objects AS o ON c.id = o.[object_id]
         INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
WHERE    text LIKE '%foo%'
ORDER BY  SCHEMA_NAME(o.schema_id),o.name 
10 голосов
/ 22 февраля 2011
SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'
7 голосов
/ 18 августа 2015

Я попробовал приведенный выше пример, но он не отображал больше 4000 символов, затем я немного его изменил и смог получить полное определение хранимой процедуры.Пожалуйста, смотрите обновленный скрипт ниже -

SELECT SCHEMA_NAME(O.SCHEMA_ID) [SCHEMA_NAME], O.NAME, OBJECT_DEFINITION(OBJECT_ID) TEXT
FROM   SYSCOMMENTS AS C
       INNER JOIN SYS.OBJECTS AS O ON C.ID = O.[OBJECT_ID]
       INNER JOIN SYS.SCHEMAS AS S ON O.SCHEMA_ID = S.SCHEMA_ID
WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%FOO%'
ORDER BY  SCHEMA_NAME(O.SCHEMA_ID), O.NAME
5 голосов
/ 11 мая 2016

Сначала убедитесь, что вы выполняете запрос под своими учетными данными, а также в правильном контексте базы данных.

USE YOUR_DATABASE_NAME;

В противном случае sys.procedures ничего не вернет. Теперь выполните запрос, как показано ниже:

select * from sys.procedures p 
join sys.syscomments s on p.object_id = s.id 
where text like '%YOUR_TEXT%';

Другой вариант - использовать INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION, но имейте в виду, что он содержит только ограниченное количество символов (т. Е. Первые 4000 символов) процедуры.

select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';

Я тестировал на Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)

3 голосов
/ 18 марта 2014
select * from sys.system_objects
where name like '%cdc%'
2 голосов
/ 07 апреля 2018

Для любого SQL-сервера новее, чем SQL-сервер 2000:

SELECT object_name = OBJECT_NAME(sm.object_id), o.type_desc, sm.definition  
FROM sys.sql_modules AS sm  
JOIN sys.objects AS o ON sm.object_id = o.object_id  
WHERE sm.definition like '%searchString%'  
ORDER BY  o.type, o.name, o.object_id

Если кто-то застрял с SQL Server 2000, таблица sql_modules не существует, поэтому вы будете использовать syscomments, вы получите несколько записей для хранимых процедур длиной более 4000 символов, но они будут иметь одинаковые c. поле , чтобы вы могли сгруппировать детали, чтобы получить полный текст хранимой процедуры:

    Select o.id, c.number, o.name, c.text  
    from syscomments c 
    inner join sysobjects o on o.id = c.id 
    where c.encrypted = 0 and o.type = 'P'  
      and c.id in  
     (Select id from syscomments where text like '%searchtext%')
    order by objecttype, o.name, o.id, c.number, c.colid        
...