powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Генерация процедур
11 сообщений из 11, страница 1 из 1
Генерация процедур
    #32017315
Yuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо сгенерить в новой базе все хранимые процедуры, которые присутствуют в исходной базе,
беря описания их, естественно, из исходной (из syscomments).
Кто может помочь? Очень надо!!!!
...
Рейтинг: 0 / 0
Генерация процедур
    #32017330
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сгенерить скрипты через ЕМ?
...
Рейтинг: 0 / 0
Генерация процедур
    #32017336
Yuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо все делать из процедуры, не через EM.
...
Рейтинг: 0 / 0
Генерация процедур
    #32017341
SergeK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-- текст процедурки
create procedure gen_proc @id int as

declare @text nvarchar(4000)
select @text = text from SourceDB..syscomments where id = @id
exec (@text)
-- конец процедурки

можно с помощью фетча пройтись по всем записям в sysobjects (описание формата таблицы есть в Books Online),
и, последовательно выбирая оттуда id объектов, являющихся процедурами, выполнять для них описанный выше код. выполняться это должно в той базе, где нужно создать процедуры из исходной.
...
Рейтинг: 0 / 0
Генерация процедур
    #32017343
Tarantino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если процедура использует врменные таблицы,т.е. перед вызовом хранимой процедыры создаётся временная таблица, хатем в неё заносятся некие данные, вызывается процедура и что делает с этими данными.
т.е. если ты достанешь код этой процедуры и выполнишь его то он не выполниться т.к. не будет временной таблицы
...
Рейтинг: 0 / 0
Генерация процедур
    #32017347
SergeK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
засомневался я, сделал тестовые прогоны в двух базах - всё работает. иначе (по логике вещей) как же писать хранимую процедуру, не имея временной таблички?

или я неправильно понял последний вопрос?
...
Рейтинг: 0 / 0
Генерация процедур
    #32017352
Yuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через exec(...) работает, если процедура не выходит за пределы nvarchar(4000), а что делать, если она большая и занимает несколько записей в syscomments?
Кроме того, текущей является исходная база и как сделать перед генерацией процедуры use
выходной базы, в одном exec'е не получается.
...
Рейтинг: 0 / 0
Генерация процедур
    #32017353
SergeK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на вторую часть вопроса - если больше 4000, то сделать слияние этих строк в одну при передаче параметров для exec(...) - у самого таких ситуаций не было, ответ взял их хэлпа по exec().

а организовать вызов gen_proc можно так:
создать её в TargetDB (можно даже в скрипте для импорта процедурок), последовательно обрабатывать записи из sysobjects в текущей базе, а процедурку вызывать TargetDB..gen_proc, и естественно, перед вызовом gen_proc учесть в логике возможность нескольких записей в syscomments.
...
Рейтинг: 0 / 0
Генерация процедур
    #32017358
Yuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно слить несколько nvarchar(4000) в одну строку, если в итоге они могут превысить
varchar(8000).
Имя выходной базы - параметр процедуры, значит use ее надо делать динамическим, и этот use уже недоступен для exec'а, создающего процедуру.
...
Рейтинг: 0 / 0
Генерация процедур
    #32017425
SergeK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
альтернативный вариант - использовать isql, правда, не знаю как быть с Encrypted.
в процедурке с двумя параметрами - @SourceDB и @TargetDB (можно туда же добавить для независимости ещё и сервера - @SourceServer и @TargetServer) пишем:

-- импорт строк из базы-источника в out.sql
select @cmd = 'isqlw -S' + @SourceServer + '-d' + @SorceDB + ' -E -iin.sql -oout.sql'
exec masterdb..xp_cmdshell @cmd

-- экспорт строк из out.sql в базу-назначение
select @cmd = 'isqlw -S' + @TargetServer + '-d' + @TargetDB + ' -E -iout.sql -oreport.txt'
exec masterdb..xp_cmdshell @cmd

в in.sql пишем:
select syscomments.text
from syscomments inner join sysobjects on syscomments.id = sysobjects.id
where sysobjects.type = 'P' and syscomments.encrypted = 0
order by syscomments.id, syscomments.colid

в результате этого селекта выбираются незашифрованные строки всех процедур, получаем скрипт для всех процедур.

Узкие места:
1. isqlw а не isql - в связи с тем, что при использовании isql не будет трансляции символов родного языка.
2. Вывод заголовков и возврат строк больше чем по умолчанию для isqlw (256 символов) корректируется в Tools - Options Query Analyser'а. Как это сделать параметрами командной строки не в курсе, -w регулирует только output-format.
3. Как убрать строчку внизу, после выполнения запроса (к примеру (198 row(s) affected)), я к сожалению не знаю (вроде как-то делал). Может кто на форуме подскажет.
4. Ну и опять же остается поднятым вопрос с Encrypted - что же делать с ними?
...
Рейтинг: 0 / 0
Генерация процедур
    #32017479
Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я что-то непонял, зачем это вообще нужно ? Новая база с теми же процедурами что и текущая...
Если уэ очень надо, можно просто сделать детачь базы, копирнуть файл, приаттачить под другим именем базы ? Если данные ненужны то транкануть таблы все... Все это можно сделать в одном скрипте...Криптованные процедуры никак сгенерить неполучиться, только предварительно разкриптовать, но это надо уже делать с помощью декриптовщика...
И потом, если данные в syscoment были удалены, для предотвращения декритпования, то только деттачь-копирование файлов-
аттачь может помочь в этой ситуации...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Генерация процедур
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]