De una forma relativamente habitual, un DBA necesita mover o copias bases de datos de una instancia de SQL Server a otra, una tarea algo tediosa, que puede automatizarse de cierta medida, utilizando un poco de Transact-SQL, y ese gran invento llamado Copiar y Pegar.
De forma similar a como se comentaba en el anterior artículo Ejecutar un Script SQL en múltiples BBDD con SQLCMD, se trata de buscar formas de facilitar ciertas tareas que podemos necesitar realizar en alguna que otra ocasión. De hecho, podemos utilizar la Excel adjunta en el anterior enlace, por ejemplo, para generar desde la excel una Tabla Derivada con el nombre de todas las Bases de Datos sobre las que deseamos generar los RESTOREs, para generar las correspondientes sentencias de BACKUP, etc.
En esta ocasión, se trata de generar las sentencias RESTOREs para un conjunto de bases de datos existentes en una instancia de SQL Server. Para ello, vamos a utilizar las vistas del sistema sys.databases y sys.master_files. Especialmente interesante resulta la vista sys.master_files, la cual muestra información de todos los ficheros de todas las bases de datos existentes en nuestra instancia de SQL Server. Esta información la necesitaremos para poder generar las cláusulas MOVE de la sentencia RESTORE DATABASE.
Quizás el principal inconveniente es que nos gustaría obtener una línea de texto (es decir una fila) para cada base de datos, sin embargo, cada base de datos tendrá como mínimo un fichero de Data y otro de Log. ¿Qué podemos hacer? Para este tipo de problemas, resulta especialmente útil utilizar la función COALESCE, como ya vimos anteriormente en el artículo Acumulado: Pasar múltiples Filas a una Columna, en una consulta SQL sin cursores.
En este caso particular, podemos crearnos dos funciones escalares, una que nos devuelva un VARCHAR con todos los MOVE correspondientes a los ficheros de Data, y otra que nos devuelva un VARCHAR con todos los MOVE correspondientes a los ficheros de Log. Ambas funciones tomarían como entrada la ruta sobre la que se desea realizar el MOVE y la Base de Datos para la cual se desea generar los MOVE, de tal modo, que consultando sys.master_files y utilizando la función del sistema COALESCE, tenemos solventado el problema.
El resto es trivial, simplemente consultar a sys.databases, filtrando (WHERE) por las bases de datos de las que deseamos generar las sentencias RESTORE, e invocando a las funciones escalares que nos hemos creado. Al final, se reduce a un simple problema de concatenación de texto.
Seguro que por muy bien que intente explicarme, surgirá más de una duda, así que para poder aclararlas, aprovecho para incluir un pequeño Script a modo de ejemplo, y sobre todo, como chuletario, para copiar y pegar cuando haga falta.
Poco más por hoy. Como siempre, confío que la lectura resulte de interés.