J'ai fait quelques recherches supplémentaires, alors voici ma compréhension de cela pour étendre ce qui a été écrit jusqu'à présent :
Qu'est-ce que SQLCMD
SQLCMD.exe
est un utilitaire de console inclus dans l'installation de SQL Server 2005 et supérieur. Vous pouvez généralement le trouver dans un chemin comme c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
.
Il s'agit d'un environnement de script simple qui permet l'automatisation des tâches liées au serveur SQL. Par exemple, vous pouvez écrire et exécuter un script qui se connectera à une instance spécifique de SQL Server, exécuter des scripts à partir d'un répertoire donné sur cette connexion et stocker la sortie dans un fichier spécifié.
Invoke-Sqlcmd
L'applet de commande a été introduite avec SQL Server 2008 pour remplacer cet outil par une approche normalisée basée sur Powershell, préservant la plupart de la syntaxe et des fonctionnalités d'origine.
Qu'est-ce que le mode SQLCMD dans SSMS
Dans SSMS, mode SQLCMD est un mode d'exécution de script qui simule l'environnement sqlcmd.exe et accepte donc certaines commandes qui ne font pas partie du langage T-SQL. Contrairement à sqlcmd.exe
, il contacte la base de données en utilisant SqlClient (de la même manière que SSMS), pas ODBC fournisseur de données, donc à certains égards, il peut avoir un comportement différent de sqlcmd.exe
.
L'exécution de scripts en mode SQLCMD permet d'utiliser des commandes typiques de sqlcmd.exe
environnement. Cependant, il n'y a pas de prise en charge d'IntelliSense ou de débogage pour le mode SQLCMD, donc la maintenance de scripts qui mélangent T-SQL propre avec du code spécifique à SQLCMD peut être pénible. Par conséquent, il ne doit être utilisé que lorsque cela est nécessaire.
Exemple de cas d'utilisation
Supposons qu'une entreprise ait une convention de dénomination pour les bases de données qui incluent l'environnement dans le nom, par exemple :MyDb_Prod , MaDb_Tester , MyDb_Dév . Cette convention peut être utilisée pour minimiser les risques d'erreurs .
Lorsqu'un développeur écrit un script T-SQL, il devra être exécuté dans différents environnements lors du processus de déploiement/test, ce qui nécessiterait de nombreuses versions du code :
SELECT *
FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod
Au lieu de cela, nous pouvons supposer que le nom de la base de données sera fourni en tant que variable SQLCMD dans le processus de déploiement et que le même fichier sera déployé dans tous les environnements :
-- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS
SELECT *
FROM [$(databaseName)].[dbo].[MyTable1]
(dans cet exemple simple, le nom de la base de données peut être complètement omis, mais si vous avez des jointures entre bases de données, l'utilisation du nom de la base de données est nécessaire)