web-dev-qa-db-fra.com

Puis-je activer le mode SQLCMD depuis l'intérieur d'un script?

Existe-t-il quelque chose comme une directive que je peux utiliser dans un script pour forcer SSMS à activer/désactiver le mode SQLCMD?

17
bernd_k

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 des terminateurs de lot GO plus tard dans le script.

Gravités 20-24 :

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.

17
Dan Nolan

Non.

Mais vous pouvez toujours exécuter en mode SQLCMD et avoir cependant 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 (:).

7
gbn