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

Откуда:
Сообщений: 63
Всем доброго времени суток =)

Допустим в бд "Demo", существует хранимая процедура "my_procedure". Ее необходимо сохранить в текстовый файл средствами скрипта, то бишь не правой кнопкой мыши -> сохранить как =).

Прошу совета=)
27 авг 12, 06:32    [13067364]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
SMO
27 авг 12, 07:02    [13067382]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
Нашел способ проще:
EXEC xp_cmdshell 'bcp "sp_helptext event3_SkvShgn" queryout C:\result.txt -c -T -C'

Правда с ошибками:
SQLState = 37000, NativeError = 102
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Неправильный синтаксис около конструкции "sp_helptext"
.
27 авг 12, 08:07    [13067431]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
Knyazev Alexey,

А проще способа не знаете?) Суть проблемы в том, что я в исходном скрипте дропаю 2 процедуры, а после создаю новые с теми же именами. Так вот в этом же скрипте хотел перед дропом, скопировать тело процедур куда нить в текстовый бэкап.=)
Да и зверопарк серверов бд широк, от mssql 2000 до mssql 2008.
27 авг 12, 08:17    [13067445]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
Еще вариант придумал:
CREATE TABLE [dbo].[#Result]
(
	[value] [VARCHAR](8000) NULL
)

INSERT [#Result] EXEC sp_helptext 'event3_SkvShgn'

EXEC xp_cmdshell 'bcp "SELECT * FROM [dbo].[#Result]" queryout C:\result.txt -c -T -C'

DROP TABLE [dbo].[#Result]


Но опять ошибка:
SQLState = S0002, NativeError = 208
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Недопустимое имя объекта "#Result".
SQLState = 37000, NativeError = 8180
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Не удалось выполнить подготовку инструкций.
27 авг 12, 08:36    [13067470]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
Почему-то с временной таблицей #Result и tempdb не отрабатывает. Но как только создаю таблицу в конкретной базе, все ок:
CREATE TABLE [webtm_dev].[dbo].[Result]
(
	[value] [VARCHAR](8000) NULL
)

INSERT [test].[dbo].[Result] EXEC sp_helptext 'event3'

EXEC xp_cmdshell 'bcp "SELECT * FROM [test].[dbo].[Result]" queryout C:\result.txt -c -T -C'

DROP TABLE [test].[dbo].[Result]
27 авг 12, 08:41    [13067478]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3019
EXEC xp_cmdshell 'bcp "select ROUTINE_DEFINITION from [MyDB].INFORMATION_SCHEMA.ROUTINES where SPECIFIC_NAME = ''event3_SkvShgn'' and SPECIFIC_SCHEMA = ''dbo''" queryout C:\result.txt -c -T -C'

?
27 авг 12, 08:59    [13067507]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3019
VASABI
Почему-то с временной таблицей #Result и tempdb не отрабатывает. Но как только создаю таблицу в конкретной базе, все ок:
CREATE TABLE [webtm_dev].[dbo].[Result]
(
	[value] [VARCHAR](8000) NULL
)

INSERT [test].[dbo].[Result] EXEC sp_helptext 'event3'

EXEC xp_cmdshell 'bcp "SELECT * FROM [test].[dbo].[Result]" queryout C:\result.txt -c -T -C'

DROP TABLE [test].[dbo].[Result]


ну так Вы создаете временную таблицу для совей сессии
bcp о ней ничего не знает, т.к работает в своей сессии. Можно конечно попробовать испоьзовать глобальные временные таблицы
27 авг 12, 09:01    [13067509]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
HandKot
EXEC xp_cmdshell 'bcp "select ROUTINE_DEFINITION from [MyDB].INFORMATION_SCHEMA.ROUTINES where SPECIFIC_NAME = ''event3_SkvShgn'' and SPECIFIC_SCHEMA = ''dbo''" queryout C:\result.txt -c -T -C'

?


Отрабатывает на УРА!=) Единственное буфер в который это все копируется явно маловат. И процедура в файле не полная.
27 авг 12, 09:16    [13067530]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
ROUTINE_DEFINITION - Возвращает первые 4 000 символов текста http://msdn.microsoft.com/ru-ru/library/ms188757.aspx =)
27 авг 12, 09:22    [13067545]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
Стоит попробовать OBJECT_DEFINITION.
27 авг 12, 09:24    [13067550]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
gang
Member

Откуда:
Сообщений: 1394
В семерке когда-то была папочка upgrade, а в ней утилитка scptxfr.exe. Предназначалась для апгрейда с семерки на 2000 (в нем кстати тоже была). Лично я дотащил ее уже до 2008R2 и до сих пор пользуюсь. Скриптует схему БД целиком. Очень полезная вещь для отката изменений сделанных в процках разработчиками. Вот тут про нее статейка.
27 авг 12, 09:31    [13067577]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
HandKot,

Опробовал два варианта:
1.
EXEC xp_cmdshell 'bcp "SELECT OBJECT_DEFINITION (OBJECT_ID(N''event3_SkvShgn''))" queryout C:\result.txt -c -T -C'


2.
EXEC xp_cmdshell 'bcp "SELECT definition FROM sys.sql_modules  WHERE object_id = OBJECT_ID(N''event3_SkvShgn'')" queryout C:\result.txt -c -T -C'


Оба вставляют пустую строку в файл, хотя при отдельном запросе в среде данные выводит.


gang,
спасибо за статейку;)
27 авг 12, 09:37    [13067592]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3019
VASABI
HandKot,

Опробовал два варианта:
1.
EXEC xp_cmdshell 'bcp "SELECT OBJECT_DEFINITION (OBJECT_ID(N''event3_SkvShgn''))" queryout C:\result.txt -c -T -C'


2.
EXEC xp_cmdshell 'bcp "SELECT definition FROM sys.sql_modules  WHERE object_id = OBJECT_ID(N''event3_SkvShgn'')" queryout C:\result.txt -c -T -C'


Оба вставляют пустую строку в файл, хотя при отдельном запросе в среде данные выводит.

так укажите имя базы
у Вас, скорее всего по умолчанию, стоит база master
27 авг 12, 09:50    [13067631]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
HandKot,

EXEC xp_cmdshell 'bcp "SELECT OBJECT_DEFINITION (OBJECT_ID(N''[test].[dbo].[event3]''))" queryout C:\result.txt -c -T -C'


Пустая строка все же О_о.
27 авг 12, 10:47    [13067914]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3019
ну вообще-то? и я говорил про sys.sql_modules и INFORMATION_SCHEMA.ROUTINES
для
OBJECT_DEFINITION 
Компонент SQL Server Database Engine предполагает, что идентификатор object_id содержится в текущем контексте базы данных
и в этом случае надо писать так
EXEC xp_cmdshell 'bcp "USE [test]; SELECT OBJECT_DEFINITION (OBJECT_ID(N''[dbo].[event3]''))" queryout C:\result.txt -c -T -C'
27 авг 12, 11:31    [13068179]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
VASABI
Member

Откуда:
Сообщений: 63
HandKot,

Вы правы, Я неправильно указывал имя БД. Теперь все Ок! Спасибо за помощь! =)
27 авг 12, 12:06    [13068459]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
sturmanserg
Member

Откуда:
Сообщений: 1
VASABI
Почему-то с временной таблицей #Result и tempdb не отрабатывает. Но как только создаю таблицу в конкретной базе, все ок:
CREATE TABLE [webtm_dev].[dbo].[Result]
(
	[value] [VARCHAR](8000) NULL
)

INSERT [test].[dbo].[Result] EXEC sp_helptext 'event3'

EXEC xp_cmdshell 'bcp "SELECT * FROM [test].[dbo].[Result]" queryout C:\result.txt -c -T -C'

DROP TABLE [test].[dbo].[Result]


CREATE TABLE ##Result
(
[value] [VARCHAR](8000) NULL
)

INSERT ##Result(value) EXEC sp_helptext 'event3'

EXEC xp_cmdshell 'bcp "SELECT * FROM ##Result" queryout C:\result.txt -c -T -C'

DROP TABLE ##Result


все работает замечательно
20 мар 13, 16:25    [14073018]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
BOL->OBJECT_DEFINITION
20 мар 13, 16:41    [14073157]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение тела процедуры в файл  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
мдя.. вот ето людям скучно однако
20 мар 13, 16:56    [14073287]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить