как сохранить хранимые процедуры SQL.файлы sql через пакет

Мне нравится сохранять хранимые процедуры MS SQL Server 2005 .sql файлы автоматически (предпочел бы инструмент, который я могу вызвать через .bat), поэтому мне не нужно нажимать каждый отдельный sproc вручную и сохранять его.

Я уже нашел SMOscript от devio, но он собирает все таблицы и sproc, что занимает некоторое время. Есть ли аналогичный инструмент, где я могу определить, какие sproc(ы) экспортировать? Также мне не хватает предложения USE, которое SMOScript не добавляет в экспортированный файл в отличие от ручной экспорт как скрипт sproc для CREATE.

с наилучшими пожеланиями Шон!--1-->

7 ответов


создать пакетный файл со скриптом (извините за форматирование ,но он действительно должен быть встроенным для выполнения пакета):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql"

назовите его " run.летучая мышь." Теперь для выполнения пакета используйте params:
бежать.bat [имя пользователя] [пароль] [имя_сервера] [база данных]
на примере:
бежать.bat sa pwd111 localhost\sqlexpress master
сначала все имена хранимых процедур будут сохранены в файле sp_list.txt, затем один за другим в отдельных файлах скриптов. Единственная проблема - последняя строка каждого сценария с результатом подсчета - я работаю над этим:)

редактировать: Исправлена ошибка в запросе

удаление "строк" строка
Хорошо, теперь нам нужно создать еще одну партию:

type %1 | findstr /V /i %2  > xxxtmpfile 
copy xxxtmpfile %1 /y /v
del xxxtmpfile

назовите его "line_del.летучая мышь." См. первый параметр - файл для обработки, 2-я строка для поиска строк для удаления. Теперь измените основной пакет (опять же, извините за форматирование):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
call line_del sp_list.txt "rows affected"
call line_del sp_list.txt "row affected"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected"

похожие статьи:
простой команды программирования в пакетной среде
программа osql
MSSQL:как создать хранимую процедуру с помощью кода?
удалить определенные строки в txt-файле с помощью пакетного файла

:) вы можете заметить, последние два из так!


в SQL Server Management Studio есть альтернатива, скриптинг базы данных...

разверните представление обозревателя объектов, чтобы найти базу данных, щелкните правой кнопкой мыши и выберите "задачи: создание скриптов"

оттуда вы можете записать все объекты, просто сохраненные preocedures, что-либо между ними. Есть довольно много вариантов на одной странице, хотя основной из них я меняю: - "Включить, если не существует"

сделав эту опцию "FALSE", вы просто получите весь список создавать операторы.

затем вы можете выбрать сценарий объектов в новое окно запроса или файл.


добавление SET NOCOUNT ON действительно устранило необходимость в line_del.bat, но замена syscomments на sys.в результате sql_modules каждая хранимая процедура усекается до 258 символов. Поэтому для достижения наилучших результатов я использовал код:

sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt"
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql"

который работал и не нуждался в использовании line_del.летучая мышь. То, что я не получил, когда я сделал ручной экспорт с помощью мастера SSMS (задачи / генерировать Скрипты / хранимые процедуры / выбрать все), было:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

at начало каждого .sql, а также команда trailing GO. Не очень важно, но кое-что стоит отметить. Спасибо Max Gontar, Seansilver и Lee за Ваш вклад! Теперь я могу автоматизировать резервное копирование хранимых процедур в базе данных и применить контроль версий.


Я хотел сделать то же самое некоторое время назад, и я закончил это, сделав небольшой vbscript.

посмотреть здесь управление версиями и хранимые процедуры


я использовал sqlcmd и-E вместо user, pass. Это прекрасно работает до сих пор, просто хранимые процедуры длиной более 4000 символов будут иметь разрыв строки

sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt"
call line_del sp_list.txt "rows affected"
call line_del sp_list.txt "row affected"
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected"

С наилучшими пожеланиями Шон!--2-->


Я добавил SET NOCOUNT ON, чтобы устранить необходимость в line_del.летучая мышь. Также заменил syscomments на sys.sql_modules (SQL 2005). Я также мог использовать функцию OBJECT_DEFINITION, но она была медленнее, чем sys.sql_modules.

sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT definition from sys.sql_modules WHERE object_id = OBJECT_ID('%%a')" -o "%%a.sql"

спасибо всем выше за помощь и оставив это здесь для других sqlcmd noobs, как я, чтобы найти. Работает на sql server 2005. objectName - это процедура, имя представления и т. д.

:reset

-- :setvar ObjectName "objectName"  -- works
:setvar ObjectName objectName  -- works too
declare @sql varchar(max);
set @sql = 'select text from dbo.syscomments where id = object_id(upper("' + '$(ObjectName)' + '"))';
-- exec sp_helptext $(ObjectName)  -- quick n easy but gets chopped to 256 width
/*   4000 byte limit
set @sql = 
   'select view_definition 
    from information_schema.views 
    where upper(table_name) = upper("' + '$(ObjectName)' + '")';
*/
:out $(ObjectName).sql

exec(@sql)
go

:out stdout