Поиск в SQL Management Studio 2005 - PullRequest
       27

Поиск в SQL Management Studio 2005

1 голос
/ 21 октября 2010

Есть ли способ поиска текста в хранимых процедурах? Например, я хочу выяснить, ссылается ли на какую-либо конкретную таблицу какая-либо хранимая процедура.

Ответы [ 5 ]

8 голосов
/ 21 октября 2010
SELECT
   OBJECT_SCHEMA_NAME(object_id) + '.' + OBJECT_NAME(object_id)
FROM
   sys.sql_modules
WHERE
   definition like '%whatever%'

syscomments является устаревшим и разбивает определение на куски nvarchar 4000, таким образом рискуя не найти то, что вы хотите. То же самое относится к INFORMATION_SCHEMA.ROUTINES

6 голосов
/ 21 октября 2010

В Red Gate есть бесплатный инструмент под названием Sql Search , который мне очень нравится.Он сохраняет индекс, так что после первого поиска он очень быстрый (и даже первый довольно хороший ...).Он может выполнять поиск текста в процедурах, а также в определениях таблиц и представлений и т. Д. Существуют некоторые функции фильтрации, облегчающие использование.И результаты поиска отображаются очень полезным образом, с выделенным полным текстом объекта и поисковым текстом.

3 голосов
/ 21 октября 2010

Использование:

SELECT OBJECT_NAME(m.object_id), m.*
  FROM SYS.SQL_MODULES m
 WHERE m.definition like N'%text_youre_looking_for%'

SYSCOMMENTS и INFORMATION_SCHEMA.routines имеют столбцы NVARCHAR (4000). Так что если «text_youre_looking_for» используется в позиции 3998, он не будет найден. SYSCOMMENTS имеет несколько строк, но INFORMATION_SCHEMA.routines усекает.

1 голос
/ 21 октября 2010

Мой коллега любезно предоставил мне это недавно.Он выполняет поиск, подобный тому, который отмечали другие, но с добавлением немного больше.

DECLARE
 @chvStringToFind varchar(256), /* String to find */
 @chrObjectType char(2),--=null, /* Only look for objects of this type */
 @intNbCharToExtract int
 --=50 /* Number of characters to extract before and after the string to find */
 --exec DBA_FindStringInDB @chvStringToFind='sp_helpdia', @chrObjectType=null, @intNbCharToExtract=50
 SET @chvStringToFind = 'EnterSearchTextHere'  -- Change this to search
 SET @chrObjectType = NULL
 SET @intNbCharToExtract = 50

 SELECT t.Name, t.TypeDescription, t.CreationDate, t.ModificationDate,
 '...' + SUBSTRING
 (
 t.ObjectDefinition,
 CHARINDEX(@chvStringToFind, t.ObjectDefinition) - @intNbCharToExtract,
 LEN(@chvStringToFind) + (@intNbCharToExtract*2)
 ) + '...' AS Extract
 FROM
 (
 SELECT o.name AS Name, 
 o.type_desc AS TypeDescription, 
 o.create_date AS CreationDate, o.modify_date AS ModificationDate,
 OBJECT_DEFINITION(object_id) AS ObjectDefinition
 FROM sys.objects o
 WHERE 
 ((o.type IN ('AF', 'FN', 'IF', 'P', 'TF', 'TT', 'U', 'V', 'X') AND @chrObjectType IS NULL) OR o.type = @chrObjectType)
 AND OBJECT_DEFINITION(o.object_id) LIKE '%' + @chvStringToFind + '%'
 ) AS t
 ORDER BY TypeDescription, Name
0 голосов
/ 21 октября 2010

Вы можете написать сценарий и найти сценарий.

...