sql >> Base de Datos >  >> RDS >> Sqlserver

cómo guardar los procedimientos almacenados de SQL en archivos .sql por lotes

Cree un archivo por lotes con secuencia de comandos (perdón por el formato, pero realmente debería estar en línea para ejecutar el 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"

Nómbrelo "run.bat". Ahora, para ejecutar el uso por lotes de parámetros:
run.bat [nombre de usuario] [contraseña] [nombre de servidor] [base de datos]
en el ejemplo:
run.bat sa pwd111 localhost\SQLEXPRESS master
primero todos los nombres de procedimientos almacenados se almacenarán en el archivo sp_list.txt, luego uno por uno en archivos de script separados. El único problema, la última línea de cada secuencia de comandos con el recuento de resultados, estoy trabajando en ello :)

editado :error en la consulta corregido

Eliminando la línea "Filas afectadas"
Bien, ahora necesitamos crear un lote más:

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

Nómbrelo "line_del.bat". Vea, el primer parámetro es el archivo para procesar, el segundo - cadena para buscar líneas para eliminar. Ahora modifique el lote principal (de nuevo, perdón por el formato):

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"

Ver artículos relacionados:
Comandos de programación simples en un entorno por lotes
Utilidad osql
MSSQL :¿Cómo se crea un script para la creación de procedimientos almacenados con código?
Eliminar ciertas líneas en un archivo txt a través de un archivo por lotes

:) puedes notar que los dos últimos son de SO!