Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

como salvar procedimentos armazenados SQL em arquivos .sql via lote


Crie um arquivo de lote com script (desculpe pela formatação, mas realmente deve estar embutido para executar o lote):
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"

Nomeie-o como "run.bat". Agora, para executar o batch use os parâmetros:
run.bat [username] [password] [servername] [database]
no exemplo:
run.bat sa pwd111 localhost\SQLEXPRESS master
primeiro todos os nomes de procedimentos armazenados serão armazenados no arquivo sp_list.txt, depois um por um em arquivos de script separados. O único problema - última linha de cada script com contagem de resultados - estou trabalhando nisso :)

editado :bug na consulta corrigido

Removendo a linha "Linhas afetadas"
Ok, agora precisamos criar mais um lote:
type %1 | findstr /V /i %2  > xxxtmpfile 
copy xxxtmpfile %1 /y /v
del xxxtmpfile

Nomeie-o como "line_del.bat". Veja, o primeiro parâmetro é o arquivo a ser processado, o 2º - string para pesquisar as linhas para remoção. Agora modifique o lote principal (novamente, desculpe a formatação):
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"

Veja artigos relacionados:
Comandos de programação simples em um ambiente de lote
Utilitário osql
MSSQL :Como você cria scripts de criação de procedimentos armazenados com código?
Excluir certas linhas em um arquivo txt por meio de um arquivo em lote

:) você pode notar, os dois últimos são do SO!