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

17

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

bernd_k
la source

Réponses:

17

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 GOdes terminateurs de lot 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.

Dan Nolan
la source
Pour ssms, les 2 premières lignes seraient suffisantes et pour sql 2000 Query Analyzer cela fonctionne, mais le message ne s'affiche pas.
bernd_k
Mais le script ne continuerait-il pas simplement à s'exécuter à partir du prochain GO?
Dan Nolan
J'utilise SSMS 2008 R2 et là les 2 lignes produisent: Meldung 102, Ebene 15, Status 1, Zeile 1 Syntaxe incorrecte près de ':'. À l'aide de l'Analyseur de requêtes SQL Server 2000, vous devez utiliser RAISERROR.
bernd_k
4
Comme mentionné ici , vous pouvez également définir SET NOEXEC ONune mesure de sécurité supplémentaire pour empêcher tout autre élément du script de s'exécuter.
Yahoo Serious
Hmm, cela utilise le mode SQLCMD pour savoir si le mode SQLCMD est activé ... Je dirais que cela ne fonctionnera pas correctement lorsque le mode SQLCMD est désactivé, comme @bernd_k l'a expérimenté. Cependant, si: setvar est supprimé / remplacé pour SQL, cela fonctionnera alors.
Oak_3260548
7

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 (:).

gbn
la source
Est-ce toujours valable pour SQL Server 2012/2014/2016?
John aka hot2use
1
@ hot2use: Oui, je l'ai utilisé le 2014/2016
gbn