Hola, chicos,
¡Buenas noches!

En este post demostraré cómo ejecutar varios scripts por lotes que se encuentran en una carpeta específica, generando un registro de ejecución, con solo una línea de código. Esta instrucción es muy simple y permite una serie de personalizaciones para satisfacer sus necesidades.

Creo que todo DBA y la mayoría de desarrolladores ya han necesitado ejecutar varios scripts SQL de forma práctica y rápida, sin olvidar ninguno y aún registrando las operaciones para posibles dudas. Esta actividad es muy común y hoy necesitaba exportar algunos SP's y funciones de una base de datos a otra, generando 174 scripts SQL (siempre creo 1 por objeto). Y, por supuesto, no los ejecutaría uno por uno manualmente.

Para esta solución, usaré el lenguaje del símbolo del sistema de Windows (CMD.exe) y el SQLCMD, la utilidad de línea de comandos de SQL Server.

Recuerda que como responsabilidad de todo DBA, debes evaluar y validar todos los scripts que te envíen para su ejecución, preferiblemente en un ambiente de prueba, desarrollo y/o preproducción. No utilice la solución presentada aquí para ejecutar varios scripts por lotes directamente en producción sin al menos probarlos primero en un entorno de prueba.

Ejemplo básico

SQL Server - Batch processing executing SQL Scripts in a folder directory
SQL Server: procesamiento por lotes ejecutando scripts SQL en un directorio de carpetas

Cree un archivo .BAT en su directorio de scripts (en este ejemplo, usaré el nombre "Execut Scripts.bat") con el siguiente comando:

for %%G in (*.sql) do sqlcmd /S localhost\sql2014 /d Testes -E -i"%%G" >> Execucao.log
pause

dónde:

  • /S: define el servidor\instancia donde se ejecutarán los scripts
  • /d: define la base de datos donde se ejecutarán los scripts
  • -E: especifica que el modo de autenticación será Conexión confiable (Autenticación de Windows AD). Si desea utilizar autenticación SQL, utilice -Uusuario y -Psenha
  • -i: especifica el archivo de entrada que contiene los comandos que se ejecutarán

SQL-Server-Batch-processing-executing-SQL-Scripts-in-a-folder-directory-SQLCMD_4
SQL-Server-procesamiento-por-lotes-ejecución-SQL-Scripts-en-un-directorio-de-carpeta-SQLCMD_4

Tenga en cuenta que en esta solución el log se genera con el resultado de ejecutar cada script, sin información de fecha y hora y sin separación entre los scripts. Como resultado, los resultados no están muy organizados dentro del archivo. Si no le importa mucho la salida del registro, puede utilizar esta solución de forma segura.

Ejemplo avanzado:

Para aquellos a quienes les gusta un poco más de organización en sus registros de ejecución, también les proporcionaré una solución un poco más avanzada, creando un registro de ejecución realmente interesante. Además, agregué el parámetro -e (si no te gusta, puedes eliminarlo), que muestra, además del resultado de los scripts ejecutados, el contenido del script en sí, para resaltar aún más la ejecución.

setlocal enableDelayedExpansion
@echo off
ECHO. > "Execucao.log"

for %%G in (*.sql) do (

	ECHO -------------------------------------------------------- >> "Execucao.log"
	ECHO !DATE! !TIME! Executando o script "%%G"... >> "Execucao.log"
	ECHO -------------------------------------------------------- >> "Execucao.log"
	ECHO. >> "Execucao.log"
	
	sqlcmd /S localhost\SQL2014 /d Testes -E -e -i"%%G" >> "Execucao.log"
	
	ECHO. >> "Execucao.log"
	ECHO Fim da execucao: !DATE! !TIME! >> "Execucao.log"
	ECHO -------------------------------------------------------- >> "Execucao.log"
	ECHO. >> "Execucao.log"
	ECHO. >> "Execucao.log"
	
)

PAUSE

Ejemplo del registro de ejecución:

SQL Server - Batch processing executing SQL Scripts in a folder directory SQLCMD Advanced
SQL Server: procesamiento por lotes ejecutando scripts SQL en un directorio de carpetas SQLCMD Advanced

¡Gracias por visitarnos y nos vemos en el próximo post!
Abrazo.

El servidor SQL ejecuta un script por lotes. Múltiples archivos de scripts desde una carpeta. Procesamiento de ejecución por lotes de sqlcmd.

El servidor SQL ejecuta un script por lotes. Múltiples archivos de scripts desde una carpeta. Ejecución por lotes de sqlcmd.