Réponses:
Comme cela a été dit, il n'y a pas moyen.
Cependant, une chose que nous faisons est d'inclure 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 not see this unless SQLCMD mode is on'
-- Rest of script goes here
GO
SET NOEXEC OFF
GO
Il y a une raison pour laquelle Severity 20 est utilisé, il a tendance à tuer la connexion immédiatement, empêchant tout code de script de s'exécuter, même s'il y a GO
des terminateurs de lot plus tard dans le script.
Indique des problèmes système et 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 n'est plus en cours d'exécution. La tâche enregistre des informations sur ce qui s'est produit, puis se termine. Dans la plupart des cas, la connexion de l'application à l'instance du moteur de base de données peut également se terminer . Si cela se produit, en fonction du problème, l'application peut ne pas pouvoir se reconnecter.
Les messages d'erreur de cette plage peuvent affecter tous les processus accédant aux données dans la même base de données et peuvent indiquer qu'une base de données ou un objet est endommagé. Les messages d'erreur dont le niveau de gravité est compris entre 19 et 24 sont écrits dans le journal des erreurs.
SET NOEXEC ON
une mesure de sécurité supplémentaire pour empêcher tout autre élément du script de s'exécuter.
Non.
Mais vous pouvez toujours exécuter en mode SQLCMD et avoir T-SQL
Pour faire une distinction claire entre les commandes SQLCMD et Transact-SQL, toutes les commandes SQLCMD doivent être préfixées par deux points (:).