Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
dimong2004
Member

Откуда:
Сообщений: 173
Как с помощью Transact-SQL вывести текст хранимой процедуры?
20 окт 09, 09:21    [7809292]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
syscomments
20 окт 09, 09:25    [7809313]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
sp_helptext <имя процедуры>
20 окт 09, 09:26    [7809317]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
BOL->OBJECT_DEFINITION()
20 окт 09, 09:26    [7809319]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
dimong2004
Member

Откуда:
Сообщений: 173
Anddros
sp_helptext <имя процедуры>


Спасибо
20 окт 09, 09:28    [7809327]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Вообще хороший способ только pkarklin назвал, он корректно сработает для объектов, длина которых превышает 4000 символов. Все остальные дают с разбиением по 4000 сим.

Но этот способ работает только начиная с 2005 сиквела.
20 окт 09, 09:42    [7809409]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
Andret
Member

Откуда: Киев
Сообщений: 84
GreenSunrise,

просто с типом text/ntext нужно правильно работать.
Читать специальными процедурами (TEXTPTR, READTEXT) постранично.
Так можно получить весть текст в любой версии.
28 окт 09, 05:48    [7847337]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Andret
GreenSunrise,

просто с типом text/ntext нужно правильно работать.
Читать специальными процедурами (TEXTPTR, READTEXT) постранично.
Так можно получить весть текст в любой версии.
Пример приведите, пожалуйста.
Пример получения текста процедуры с длинными строками (>4000 символов), имеется в виду.
28 окт 09, 09:04    [7847519]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
dimong2004
Как с помощью Transact-SQL вывести текст хранимой процедуры?

SELECT definition
FROM sys.sql_modules
WHERE object_name(object_id) = ...
28 окт 09, 09:05    [7847520]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью Transact-SQL вывести текст хранимой процедуры?  [new]
Andret
Member

Откуда: Киев
Сообщений: 84
iap,

Тьфу, посмотрел и вспомнил, что там поле nvarchar а не ntext.
Это я спутал с функцией ::fn_get_sql(@sql_handle), которая тип text возвращает.

Но, кстати, это дела не меняет. Ну и чем разбивка по 4к мешает?
Возможно, путаете с возможностями SELECT <field>, который больше кажется 256 по умолчанию не возвращает.
Для вывода средствами QA нужно пользоваться оператором "print".
Пример:
declare	@str nvarchar(4000),
	@name sysname,
	@save_name sysname
declare	@curr cursor
set	@curr = cursor for
	select	c.[text], o.name
	from	syscomments c
	join	sysobjects o on c.id = o.id and o.type = 'P'
	order by o.name, c.number
	for read only
open	@curr
fetch @curr into @str, @name
while	@@fetch_status > -1
begin
	if @name <> @save_name or @save_name is null
	begin
		print replicate('-', 80)
		print '-- ' + @name
		print replicate('-', 80)
	end
	print @str
	set @save_name = @name
	fetch @curr into @str, @name
end

Есть конечно нюанс, что QA или SQLMS на очень длинных строках могут добавить нежелательный перевод каретки.
Пример очень длинной строки:
print 'create proc pr_test_list
as
declare	@var int set @var = 1 ' + replicate('begin set @var = @var + 1 end ', 250) + ' print @var'

Но этот эффект наверное тоже можно побороть, а для своего клиента конечно не проблема :-)
31 окт 09, 07:28    [7865883]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить