Crear archivo por lotes con la escritura (lo siento sobre el formato, pero en realidad debería estar en línea para ejecutar por lotes):
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"
el nombre de "run.bat". Ahora, para ejecutar por lotes params uso:
run.bat [nombre de usuario] [contraseña] [servidor] [base de datos]
de ejemplo:
run.bat sa pwd111 localhost \ SQLEXPRESS maestro
nombres de los procedimientos almacenados primero de todo será almacenado en el archivo sp_list.txt, luego uno por uno en archivos de script separados. El único problema - la última línea de cada script con el recuento de resultado - Estoy trabajando en él :)
editado: error en la consulta fija
Extracción 'filas afectadas' línea
Ok, ahora tenemos que crear un lote más:
type %1 | findstr /V /i %2 > xxxtmpfile
copy xxxtmpfile %1 /y /v
del xxxtmpfile
Llámalo "line_del.bat". Ver, el primer parámetro es archivo para procesar, 2da cadena para buscar líneas para eliminar.Ahora modifique el lote principal (de nuevo, lo siento sobre 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:
Simple programming commands in a batch environment
osql Utility
MSSQL: How do you script Stored Procedure creation with code?
Delete certain lines in a txt file via a batch file
:) se puede notar que dos últimos son de ¡ASI QUE!
¡Muchas gracias! He intentado un poco, pero tengo algunos problemas con la autenticación (osql no puedo conectar). Lo intentaré de nuevo los próximos días ... mis mejores deseos – seansilver
¿No sería así para los procs grandes? Cuando corro: SELECCIONAR ROUTINE_NAME, max (len (ROUTINE_DEFINITION)) FROM INFORMATION_SCHEMA.Routines group by ROUTINE_NAME ordenar por 2 desc; Obtengo muchos procs de 4000 caracteres. Seguro que necesita salir de sys.comments para obtener los datos correctos. – jcollum
Vaya, eso debería ser syscomments en el comentario anterior. – jcollum