Можете ли вы искать содержимое хранимой процедуры SQL Server 2005? - PullRequest
25 голосов
/ 21 января 2009

SQL Server Server 2005. Я смотрю на базу данных, в которой хранится более 500 хранимых процедур, и пытаюсь выяснить тонкости их взаимодействия с данными, особенно в отношении того, как они вставляют / изменяют данные. Я надеялся найти функцию поиска или поиска, которая бы смотрела на содержание фактической процедуры. Таким образом, я мог бы выполнить поиск всех процедур, которые вообще что-либо делают с some_table_name. Базовая функция поиска SQL Management Studio выполняет поиск в открытых файлах, а функция «Поиск в файлах» появляется только для поиска содержимого, если у меня уже есть sproc, и даже тогда только во временных файлах типа ... \ Local Settings \ Temp \ ~ vs1011.sql.

На данный момент единственный известный мне способ добраться до базовой процедуры - это щелкнуть правой кнопкой мыши и выбрать «изменить» (или «Хранимая процедура сценария как => Создать или Изменить»). Есть ли более быстрый / простой способ поиска / изучения всех звезд?

Ответы [ 16 ]

26 голосов
/ 05 июня 2013

Попробуйте использовать сторонние инструменты, такие как ApexSQL Search (бесплатно) или SSMS Toolpack (бесплатно), помимо уже упомянутых здесь.

У меня была похожая проблема в прошлом, когда я унаследовал 500+ объектов базы данных. Мой опыт показывает, что запросы в порядке, но что действительно помогло, так это сторонние надстройки SSMS.

24 голосов
/ 21 января 2009

Не используйте INFORMATION_SCHEMA.ROUTINES. Он обрезает 4000 символов. Вместо этого получите его из sys.sql_modules.

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%'

(Как написано, это также возвратит триггеры, представления и скалярные функции. Исключите их по типу, если хотите)

15 голосов
/ 21 января 2009

Существует представление Information_Schema.Routines, которое вы можете использовать.

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'
4 голосов
/ 05 марта 2012

Продукт RedGate для поиска SQL справляется с этим легко и бесплатно. http://www.red -gate.com / продукты / SQL-разработка / SQL-поиск /

3 голосов
/ 21 января 2009

Массовый экспорт в текстовые файлы и индексация их с помощью Google Desktop.

2 голосов
/ 21 января 2009

Да.

  1. вы можете выбрать * из sys.syscomments

  2. если у вас есть VS для базы данных Pro. Вы можете создать проект базы данных и импортировать схему из базы данных и выполнить поиск в проекте.

2 голосов
/ 21 января 2009
SELECT DISTINCT OBJECT_NAME(id) AS ObjectName, [Text] AS CodeSnippet 
FROM syscomments (nolock) 
WHERE [TEXT] LIKE '%Whatever You Want To Search For%'
2 голосов
/ 21 января 2009
select top 10 * from syscomments

Вы также можете найти sp_grep, популярную, хотя и не включенную, процедуру, которая делает это.

1 голос
/ 30 сентября 2014

введите название вашего процесса, где написано Place Proc Name Here

sp_msforeachdb'Выберите DISTINCT o.name, o.xtype FROM? .Dbo.syscomments c INNER JOIN? .Dbo.sysобъекты o ON c.id = o.id ГДЕ c.TEXT LIKE ''% Поместите имя Proc здесь '' '

0 голосов
/ 22 января 2009

Я написал модуль Perl, который позволяет мне делать это и многое другое. С его помощью я могу манипулировать представлениями / sprocs (и кодом Perl) с помощью операторов SQL. #! / Usr / bin / perl

# использовать Codebase;

использовать строгое; используйте предупреждения;

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

exit;

sub change { my $ 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

END выберите имя (records.fullname) || расширение (records.fullname) в качестве имени, grep (m / \ W (23 | 25 | 27 | 28 | 29 | 31 | 32 | InstallStatus | InstallStatusNew | InstallStatusOld) \ W /, объекты .definition, 3) как ЛИСТИНГ из записей внутренние объекты объединения на записи .OId = objects.OId где (путь (records.fullname) в ('BETA: /') и records.kind = 'view') и (((определение объектов. как m / \ W (TRACKING) \ W /) и (определение объектов. как m / \ WInstallStatus (\ W | \ s) /)) или ((определение объектов. как m / \ W (TRACKING_LOG) \ W /) и (определение объектов. как m / \ WInstallStatus (New | 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

`

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