¡Buenas noches!

En este post hablaré un poco más sobre SQLCMD, la utilidad de línea de comandos de SQL Server. Como DBA de Oracle, solo usaba SQL*Plus, que es la utilidad de línea de comandos de Oracle, para realizar mis actividades y me pareció súper práctico, liviano, la posibilidad de crear scripts altamente personalizables y fáciles de ejecutar (@wait, @locks, etc), 0% de uso del procesador de la máquina y menos de 20 MB de memoria.

Descubrí SQLCMD cuando iba a realizar alguna actividad en bases de datos SQL Server y pensé que enviar evidencia de ejecución tomando una captura de pantalla de SQL Management Studio era un poco extraño. Estaba acostumbrado a SQL*Plus, donde generaba un spool y toda la salida de los comandos ejecutados y la devolución se escribían en un archivo de texto de salida, que enviaba a los solicitantes de actividad como evidencia.

De hecho, SQL*Plus es mucho más completo que SQLCMD, pero esto no le quita el mérito a SQLCMD, que me fue de gran ayuda en un caso en el que necesitaba ejecutar un script SQL de 500 MB para importar datos a una base de datos de SQL Server. Probé Management Studio unas 10 veces, pero no cargaba el archivo ni siquiera para orar. La solución fue utilizar el conocido SQLCMD, que realizaba la actividad con 1 línea de comando, sin ningún problema.

No voy a entrar en mucho detalle, porque realmente hay muchísimos parámetros de SQLCMD, así como comandos de la propia herramienta para “programar” en ella, como macros, definición de variables, etc. Sólo me centraré en las características principales. Si quieres profundizar más, te sugiero visitar el Página SQLCMD de Microsoft o comprobar este enlace (en inglés)

Otro uso interesante de SQLCMD es la ejecución masiva de scripts (por lotes), como lo demuestro en el artículo. SQL Server: cómo ejecutar por lotes todos los scripts .sql en una carpeta o directorio usando SQLCMD.

 

Parámetros de conexión

  • -d : Se utiliza para especificar el nombre de la base de datos en la que se ejecutará el comando. Este parámetro actualmente está obsoleto y debería deshabilitarse en futuras versiones, siendo reemplazado por el comando USE [banco].
  • -S : Se utiliza para especificar el servidor de conexión de SQL Server. Si desea conectarse a una instancia distinta a la predeterminada o el servidor tiene un puerto distinto al predeterminado (1433), use la sintaxis:
    sqlcmd -S \, .
    Ej: sqlcmd -S server_casa\instanciaTeste, 1453
  • -A: Le permite conectarse al servidor con una conexión dedicada para el administrador de la base de datos (Dedicated Administrator Connection – DAC)

 

Parámetros de inicio de sesión

  • -E: intenta conectarse al servidor utilizando el modo de autenticación de autenticación de Windows. No es necesario introducir el usuario ni la contraseña, ya que la conexión se realiza utilizando el usuario que ha iniciado sesión en la máquina, que previamente está registrado en Active Directory. Si no se proporcionan los parámetros -P o -U, este parámetro se utiliza automáticamente.
  • -U -P : Intenta conectarse al servidor usando el modo de autenticación SQL Server Authentication, donde es necesario ingresar un nombre de usuario y contraseña y este usuario debe haber sido creado previamente en las políticas de usuario del servidor (En Management Studio, Seguridad > Inicios de sesión)

 

Parámetros de entrada y salida de archivos

  • -i : define el archivo de entrada que ejecutará SQLCMD. Si parte del camino tiene espacios, usa comillas (yo siempre las uso, haya espacio o no).
    Ej: sqlcmd -S pc-casa -i “C:\Mis archivos\query.sql”
  • -o : Define el archivo de salida, donde se escribirán los mensajes de salida devueltos por SQLCMD.
  • -e: Define que las consultas contenidas en el archivo de entrada también aparecen en el archivo de salida.
  • -u: Define que el archivo de salida se escribirá en formato Unicode (UTF-8).

 

Parámetros de consulta

  • -q : Ejecuta la consulta pasada como parámetro (use comillas). Para ejecutar más de una consulta, utilice el punto y coma (;). Este parámetro no se puede utilizar junto con -i, ya que son mutuamente excluyentes.
  • -Q : Hace lo mismo que el parámetro -q, pero después de la ejecución, cierra SQLCMD.
  • -t : Define el tiempo de espera (en segundos) de la consulta que se ejecutará. Después de superar el límite definido, la conexión se cerrará, incluso si aún no se ha ejecutado por completo.
  • -s : establece el carácter separador de columnas.
    Ej: sqlcmd -S pc-casa -s ; -Q “seleccionar * de sys.sysobjects”
  • -W: elimina los espacios en blanco finales.

 

Parámetros de error

  • -m: define en qué nivel de gravedad del error se escribirán los mensajes en el archivo de salida. Usando el parámetro -1 se grabarán todos los mensajes, incluidos los informativos. Este parámetro no acepta espacios. -m-1 es válido, pero -m -1 no lo es.
  • -V : define en qué nivel de gravedad los mensajes devueltos se tratarán como errores.

 

Parámetros varios

  • -?: Muestra la AYUDA de SQLCMD

 

Ejemplos de uso

-- Conecta no servidor "servidor-casa", utilizando o usuário "dirceu", senha "resende", executa o script "teste.sql" e grava o resultado e o próprio arquivo de entrada no arquivo teste.log
sqlcmd -S servidor-casa -U dirceu -P resende -i "C:\Meus Dados\SQL\teste.sql" -e -o "C:\Meus Dados\SQL\teste.log"

-- Conecta no servidor "servidor-casa" utilizando autenticação Windows e executa o script "teste.sql"
sqlcmd -S servidor-casa -i "C:\Meus Dados\SQL\teste.sql"

-- Conecta no servidor "servidor-casa", instância "instanciaTeste", porta 1453. Executa uma query no servidor, onde o tempo de expiração é de 60 segundos. O resultado da query virá separado por ";" e não terá espaços em branco.
sqlcmd -S servidor-casa\instanciaTeste,1453 -q "SELECT TOP 10 * FROM sys.sysobjects" -t 60 -s ; -W

-- Conecta no servidor "servidor-casa", executa uma query no servidor, onde o tempo de expiração é 30 segundos. O resultado da query virá separado por ";", não terá espaços em branco e será gravado no arquivo "saida.log"
sqlcmd -S servidor-casa -q "SELECT * FROM sys.sysobjects" -t 30 -s ; -W -e -o "C:\saida.log"

También es posible ejecutar consultas normalmente en SQLCMD (entonces creo que es mejor hacerlo en Management Studio... jajaja)

SQLCMD - Exemplo
SQLCMD - Ejemplo

Establecer el ancho máximo en 30 caracteres

SQLCMD - Exemplos
SQLCMD - Ejemplos

Definiendo que no habrá espacios en blanco y el separador de columnas será “;”

SQLCMD - Exemplos
SQLCMD - Ejemplos

Definiendo que no habrá espacios en blanco, el separador de columnas será “;” y sin encabezados

Eso es todo amigos
¡Hasta la próxima!