Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как получить текст всех хранимых процедур  [new]
cpp
Guest
Привет!
В чужой базе около 100 процедур. Для изучения их работы необходимо получить распечатку текста сразу всех хранимых процедур - так удобнее и быстрее. Как это сделать?
Спасибо!
13 мар 03, 11:20    [146278]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
На базе данных в ЕМ щелкаешь All Tasks->Generate SQL Script, щелкаешь Show All, ставишь галку All Stored Proc, в Formating убираешь Drop и генеришь.
13 мар 03, 11:32    [146300]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
Предводитель команчей
Member

Откуда: Днепропетровск
Сообщений: 321
Привет.
В системной таблице syscomments содержится тексты ХП. Свяжите syscomments и sysobjects по id и задайте условие по полю xtype (это из sysobjects) = 'P' - это есть ХП. Ну примерно так :

select sc.id, so.name, sc.text
from sysobjects so
left join syscomments sc on sc.id = so.id
where so.xtype = 'p'
order by sc.id


Удачи
13 мар 03, 11:38    [146310]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
Предводитель команчей
Member

Откуда: Днепропетровск
Сообщений: 321
2 All
что это я в самом деле... не проснулся что-ли. 8-). Drag & Drop - вот в чем сила, брат .

Удачи.
13 мар 03, 11:41    [146320]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
cpp
Guest
Мне подходит вариант
select sc.id, so.name, sc.text 

from sysobjects so
left join syscomments sc on sc.id = so.id
where so.xtype = 'p'
order by sc.id

но как сделать чтобы текст в sc.text не усекался (выводится неполный текст процедуры).
13 мар 03, 11:56    [146350]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Тебе ж pkarklin самый лучший вариант предложил...
13 мар 03, 11:59    [146358]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
cpp
Guest
У меня сервер 2000, а EM от 6.5 (я не админ).
Есть только Platinum ERWin...
13 мар 03, 12:06    [146381]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
cpp
Guest
Отвечаю сам себе - может кому сгодится
select sc.id, so.name, CONVERT(text, sc.text)

from sysobjects so
left join syscomments sc on sc.id = so.id
where so.xtype = 'P'
order by sc.id
13 мар 03, 12:13    [146390]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
В syscomments текст процеур хранится кусками по 8000 байт, поэтому такой запрос для больших процедур нужно склеивать... или использовать sp_helptext в курсоре
13 мар 03, 21:06    [147145]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст всех хранимых процедур  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
ну зачем же курсор....
CREATE PROC USP_GETTEXTSP

SET NOCOUNT ON
DECLARE @m INT,@c INT,@q VARCHAR(8000),@tname VARCHAR(50)
CREATE TABLE #r (i INT,t NTEXT)
SELECT o.[id] i, c.colid as [c],c.[text] t
INTO #t
FROM (SELECT [id]
FROM dbo.sysobjects
WHERE xtype='P'
) o JOIN dbo.syscomments c
ON o.[id] = c.[id]
-- part 1 вставляем текст процек которые помещаются в одном поле

INSERT #r
SELECT i,t
FROM #t t
WHERE NOT EXISTS(SELECT * FROM #t WHERE #t.i=t.i AND #t.c>1)
DELETE #t FROM #r t WHERE #t.i=t.i
-- part 2 остальные

SELECT @tname='##tmp'+CAST(@@PROCID AS VARCHAR(30)),
@c=1,@q='',@m=MAX(t.c) FROM #t t
WHILE @m>=@c
BEGIN
SELECT @q=@q+',t'+CAST(@c AS VARCHAR(10))+' NTEXT DEFAULT('''')',@c=@c+1
END
EXEC('CREATE TABLE '+@tname+' (i INT'+@q+')')
EXEC('INSERT '+@tname+' (i,t1) SELECT i,t FROM #t WHERE c=1 DELETE #t WHERE c=1')
SELECT @c=2,@q=''
WHILE @m>=@c
BEGIN
SELECT @q='UPDATE '+@tname+' SET t'+CAST(@c AS VARCHAR(10))+
'= t FROM #t WHERE '+@tname+'.i=#t.i AND #t.c='+
CAST(@c AS VARCHAR(10))+' DELETE #t WHERE c='+
CAST(@c AS VARCHAR(10)), @c=@c+1
PRINT @q
EXEC(@q)
END
SELECT @c=2,@q=''
WHILE @m>=@c
BEGIN
SELECT @q=@q+' +CAST(t'+CAST(@c AS VARCHAR(10))+' AS NVARCHAR(4000))', @c=@c+1
END
PRINT @q
EXEC('INSERT #r SELECT i,CAST(t1 AS NVARCHAR(4000))'+@q+' FROM '+@tname)
EXEC('DROP TABLE '+@tname)
SELECT * FROM #r
13 мар 03, 22:50    [147184]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить