sql >> Base de Datos >  >> Database Tools >> SSMS

En SQL Server Management Studio, ¿qué es el modo SQLCMD?

Investigué un poco más, así que aquí está mi comprensión de esto para ampliar lo que se ha escrito hasta ahora:

¿Qué es SQLCMD?

SQLCMD.exe es una utilidad de consola incluida en la instalación de SQL Server 2005 y superior. Por lo general, puede encontrarlo en una ruta como c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE .

Es un entorno de secuencias de comandos simple que permite la automatización de tareas relacionadas con el servidor SQL. Por ejemplo, puede escribir y ejecutar un script que iniciará sesión en una instancia específica de SQL Server, ejecutará scripts desde un directorio determinado en esta conexión y almacenará el resultado en un archivo específico.

Invoke-Sqlcmd cmdlet se introdujo con SQL Server 2008 como un medio para reemplazar esta herramienta con un enfoque estandarizado basado en Powershell, conservando la mayor parte de la sintaxis y la funcionalidad originales.

¿Qué es el modo SQLCMD en SSMS

En SSMS, modo SQLCMD es un modo de ejecución de script que simula el entorno sqlcmd.exe y, por lo tanto, acepta algunos comandos que no forman parte del lenguaje T-SQL. A diferencia de sqlcmd.exe , contacta con la base de datos usando SqlClient (de la misma manera que SSMS), no ODBC proveedor de datos, por lo que en algunos aspectos podría tener un comportamiento diferente al de sqlcmd.exe .

Ejecutar scripts en modo SQLCMD permite usar comandos típicos de sqlcmd.exe medioambiente. Sin embargo, no hay compatibilidad con IntelliSense o depuración para el modo SQLCMD, por lo que mantener scripts que mezclen T-SQL limpio con código específico de SQLCMD puede ser una molestia. Por lo tanto, debe usarse solo cuando sea necesario.

Ejemplo de caso de uso

Supongamos que una empresa tiene una convención de nomenclatura para las bases de datos que incluyen el entorno en el nombre, por ejemplo:MyDb_Prod , MiDb_Prueba , MyDb_Dispositivo . Esta convención podría usarse para minimizar la posibilidad de errores .

Cuando un desarrollador escribe un script T-SQL, deberá ejecutarse en diferentes entornos en el proceso de implementación/prueba, lo que requerirá muchas versiones del código:

 SELECT *
 FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod

En su lugar, podemos suponer que el nombre de la base de datos se proporcionará como una variable SQLCMD en el proceso de implementación y se implementará exactamente el mismo archivo en todos los entornos:

 -- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS

 SELECT *
 FROM [$(databaseName)].[dbo].[MyTable1]

(en este ejemplo simple, el nombre de la base de datos podría omitirse por completo, pero si tiene uniones entre bases de datos, es necesario usar el nombre de la base de datos)