Найти хранимую процедуру Sybase в БД по заданной текстовой строке - PullRequest
10 голосов
/ 30 октября 2008

Как мне найти хранимую процедуру в базе данных Sybase, учитывая текстовую строку, которая появляется где-то в процедуре? Я хочу посмотреть, имеет ли какой-либо другой процесс в БД схожую логику с той, на которую я смотрю, и я думаю, что у меня есть довольно уникальная строка поиска (литерал)

Edit:

Я использую Sybase версии 11.2

Ответы [ 6 ]

15 голосов
/ 06 ноября 2008

Два варианта ответа Грэма (так что это также не сработает на 11.2):

Здесь также указано имя спрока, но для каждого спрока будет возвращаться несколько строк, если текст появляется несколько раз:

select object_name(id),* from syscomments 
   where texttype = 0 and text like '%whatever%'

В этом списке каждый sproc только один раз:

select distinct object_name(id) from syscomments 
   where texttype = 0 and text like '%whatever%'
7 голосов
/ 30 октября 2008

В SQL Anywhere и Sybase IQ:

select * from SYS.SYSPROCEDURE where proc_defn like '%whatever%'

Я не очень знаком с ASE, но согласно документации (доступной на sybooks.sybase.com), это что-то вроде:

select * from syscomments where texttype = 0 and text like '%whatever%'
6 голосов
/ 13 июля 2010
select *  from sysobjects where 
    id in ( select distinct (id) from syscomments where text like '%SearchTerm%')
    and xtype = 'P'
5 голосов
/ 29 декабря 2011

Пожалуйста, помните, что текстовый столбец в syscomments - это varchar (255), поэтому одна большая процедура может состоять из многих строк в syscomments, поэтому при выборе выше не будет найдено имя процедуры, если она разбита на 2 строки syscomments.

Я предлагаю следующий выбор, который будет обрабатывать вышеуказанный случай:

declare @text varchar(100)
select @text        = "%whatever%"

select distinct o.name object
from sysobjects o,
    syscomments c
where o.id=c.id
and o.type='P'
and (c.text like @text
or  exists(
    select 1 from syscomments c2 
        where c.id=c2.id 
        and c.colid+1=c2.colid 
        and right(c.text,100)+ substring(c2.text, 1, 100) like @text 
    )
)
order by 1

- благодарность за это идет создателю ASEisql

3 голосов
/ 12 августа 2010
select distinct object_name(syscomments.id) 'SearchText', syscomments.id from syscomments ,sysobjects 
   where texttype = 0 and text like '%SearchText%' and syscomments.id=sysobjects.id and sysobjects.type='P'
0 голосов
/ 06 июня 2018

Несколько строк используются для хранения текста для объектов базы данных, значение может быть в двух строках. Таким образом, более точный ответ:

select distinct object_name(sc1.id)
from syscomments sc1
left join syscomments sc2
on (sc2.id = sc1.id and 
sc2.number = sc1.number and
sc2.colid2 = sc1.colid2 + ((sc1.colid + 1) / 32768) and
sc2.colid = (sc1.colid + 1) % 32768)
where
sc1.texttype = 0 and
sc2.texttype = 0 and
lower(sc1.text + sc2.text) like lower('%' ||     @textSearched || '%')
...