Puis-je activer le mode SQLCMD à partir dun script?

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.

Gravités 20-24 :

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

  • Pour ssms, les 2 premières lignes suffiraient et pour lanalyseur de requêtes sql 2000, cela fonctionne, mais le message nest pas affiché.
  • Mais ' le script continue-t-il simplement de s’exécuter à partir du prochain GO?
  • Comme mentionné ici , vous pouvez également définir 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.
  • @Dan Nolan: Je vois, dune manière ou dune autre, jai raté le point de la 3e ligne. Donc, si je comprends bien, il ny a ' aucune solution pour désactiver le mode SQLCMD. Il affichera essentiellement incorrect syntax near ':' à cause de :setvar au début …
  • @youcantryreachingme 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 le SET NOEXEC ON) est exécuté. La raison pour laquelle les instructions NOEXEC sont là est pour couvrir le cas où lutilisateur exécutant na pas sysadmin / ALTER TRACE privilèges, nécessaires pour signaler des erreurs fatales.

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *