Puede usar osql o mejor aún el sqlcmd más nuevo de manera casi intercambiable. Estoy usando osql en este ejemplo solo porque tuve una muestra de código pero en producción estoy usando sqlcmd. Aquí hay un código eliminado de un procedimiento más grande que utilizo para ejecutar scripts de actualización contra bases de datos. Se ordenan por mayor, menor, versión, compilación como yo nombro mis guiones usando esa convención para rastrear lanzamientos. Obviamente, se está perdiendo todo el manejo de errores, las partes donde extraigo las secuencias de comandos disponibles de la base de datos, las variables de configuración, etc., pero aún puede resultar útil este fragmento.
La parte principal que me gusta de usar osql o sqlcmd es que puede ejecutar este código en sms, o en un procedimiento almacenado (llamado tal vez de forma programada) o desde un archivo por lotes. Muy flexible.
--Use cursor to run upgrade scripts
DECLARE OSQL_cursor CURSOR
READ_ONLY
FOR SELECT FileName
FROM #Scripts
ORDER BY Major, Minor, Release, Build
OPEN OSQL_cursor
FETCH NEXT FROM OSQL_cursor INTO @name
WHILE (@@fetch_status <> -1)
BEGIN
IF ((@@fetch_status <> -2) AND (@result = 0))
BEGIN
SET @CommandString = 'osql -S ' + @@ServerName + ' -E -n -b -d ' + @DbName + ' -i "' + @Dir + @name + '"'
EXEC @result = master.dbo.xp_cmdshell @CommandString, NO_OUTPUT
IF (@result = 0)
BEGIN
SET @Seconds = DATEDIFF(s, @LastTime, GETDATE())
SET @Minutes = @Seconds/60
SET @Seconds = @Seconds - (@Minutes * 60)
PRINT 'Successfully applied ' + @name + ' in ' + cast(@Minutes as varchar)
+ ' minutes ' + cast(@Seconds as varchar) + ' seconds.'
SET @LastTime = GETDATE()
END
ELSE
BEGIN
SET @errMessage = 'Error applying ' + @name + '! The database is in an unknown state and the schema may not match the version.'
SET @errMessage = @errMessage + char(13) + 'To find the error restore the database to version ' + @StartingVersion
SET @errMessage = @errMessage + ', set @UpToVersion = the last version successfully applied, then run ' + @name
SET @errMessage = @errMessage + ' manually in Query Analyzer.'
END
IF @name = (@UpToVersion + '.sql')
GOTO CleanUpCursor --Quit if the final script specified has been run.
END
FETCH ENDT FROM OSQL_cursor INTO @name
END
cuando se dice la escritura Qué quiere decir un archivo sql? –
sí, me refiero a un archivo .sql. ¡Gracias! –