Y a-t-il quelque chose comme une directive que je peux utiliser dans un script pour forcer SSMS à activer / désactiver le mode SQLCMD?
Réponse
Comme cela a été dit, il ny a pas de moyen.
Cependant, une chose que nous est dinclure une vérification rapide dans notre en-tête de script, pour déterminer si le mode SQLCMD est activé (et terminer le script sinon):
:setvar DatabaseName "MyDatabase" GO IF ("$(DatabaseName)" = "$" + "(DatabaseName)") RAISERROR ("This script must be run in SQLCMD mode. Disconnecting.", 20, 1) WITH LOG GO -- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors IF @@ERROR != 0 SET NOEXEC ON GO PRINT "You will only see this when SQLCMD mode is on" -- Rest of script goes here GO SET NOEXEC OFF GO
Il y a un raison pour laquelle la gravité 20 est utilisée, elle a tendance à interrompre immédiatement la connexion, empêchant lexécution de plus de code de script, même sil y a des terminateurs de lot GO
plus tard dans le script.
Indique des problèmes système et sont des erreurs fatales, ce qui signifie que la tâche du moteur de base de données qui exécute une instruction ou un lot nest plus en cours dexécution. La tâche enregistre des informations sur ce qui sest passé puis se termine. Dans la plupart des cas, la connexion de lapplication à linstance du moteur de base de données peut également se terminer . Si cela se produit, selon le problème em, lapplication peut ne pas être en mesure de se reconnecter.
Les messages derreur dans cette plage peuvent affecter tous les processus accédant aux données de la même base de données et peuvent indiquer quune base de données ou un objet est endommagé. Les messages derreur avec un niveau de gravité de 19 à 24 sont écrits dans le journal des erreurs.
Commentaires
Réponse
Non.
Mais vous pouvez toujours exécuter en mode SQLCMD et avoir T-SQL dedans cependant
Pour faire une distinction claire entre les commandes SQLCMD et Transact-SQL, toutes les commandes SQLCMD doivent être précédées dun signe deux-points (:).
Commentaires
- Est-ce toujours valable pour SQL Server 2012/2014/2016?
- @ hot2use: Oui, je ' lai utilisé en 2014/2016
SET NOEXEC ON
comme une mesure de sécurité supplémentaire pour empêcher quoi que ce soit dautre dans le script de sexécuter.incorrect syntax near ':'
à cause de:setvar
au début …RAISERROR
niveau de gravité 20 (et supérieur) est considéré par SQL comme une erreur fatale, ce qui entraîne la suppression immédiate de la connexion, donc aucun autre lot (pas même leSET NOEXEC ON
) est exécuté. La raison pour laquelle les instructionsNOEXEC
sont là est pour couvrir le cas où lutilisateur exécutant na passysadmin
/ALTER TRACE
privilèges, nécessaires pour signaler des erreurs fatales.