Kann ich den SQLCMD-Modus in einem Skript aktivieren?

17

Gibt es so etwas wie eine Direktive, die ich in einem Skript verwenden kann, um SSMS zu zwingen, den SQLCMD-Modus zu aktivieren / deaktivieren?

bernd_k
quelle

Antworten:

17

Wie gesagt, es gibt keinen Weg.

Eine Sache, die wir tun, ist jedoch, eine schnelle Überprüfung in unseren Skript-Header aufzunehmen, um festzustellen, ob der SQLCMD-Modus aktiviert ist (und das Skript zu beenden, wenn nicht):

: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

Es gibt einen Grund, warum der Schweregrad 20 verwendet wird. Die Verbindung wird in der Regel sofort GOabgebrochen , sodass kein Skriptcode mehr ausgeführt werden kann, selbst wenn das Skript später Stapelabschlusszeichen enthält.

Schweregrade 20-24 :

Hinweis auf Systemprobleme und schwerwiegende Fehler. Dies bedeutet, dass die Datenbankmodul-Task, die eine Anweisung oder einen Stapel ausführt, nicht mehr ausgeführt wird. Die Aufgabe zeichnet Informationen darüber auf, was aufgetreten ist, und wird dann beendet. In den meisten Fällen wird die Anwendungsverbindung zur Instanz des Datenbankmoduls möglicherweise ebenfalls beendet . In diesem Fall kann die Anwendung je nach Problem möglicherweise keine Verbindung mehr herstellen.

Fehlermeldungen in diesem Bereich können sich auf alle Prozesse auswirken, die auf Daten in derselben Datenbank zugreifen, und können darauf hinweisen, dass eine Datenbank oder ein Objekt beschädigt ist. Fehlermeldungen mit einem Schweregrad von 19 bis 24 werden in das Fehlerprotokoll geschrieben.

Dan Nolan
quelle
Für ssms wären die ersten 2 Zeilen ausreichend und für sql 2000 Query Analyzer funktioniert es, aber die Meldung wird nicht angezeigt.
bernd_k
Aber würde das Skript nicht einfach ab dem nächsten Start weiter ausgeführt?
Dan Nolan
Ich benutze SSMS 2008 R2 und dort erzeugen die 2 Zeilen: Meldung 102, Ebene 15, Status 1, Zeile 1 Inkorrekte Syntax bei ':'. Mit SQL Server 2000 Query Analyzer müssen Sie RAISERROR verwenden.
bernd_k
4
Wie hier erwähnt , können Sie SET NOEXEC ONals zusätzliche Sicherheitsmaßnahme festlegen , dass nichts anderes im Skript ausgeführt wird.
Yahoo Serious
Hmm, dies verwendet den SQLCMD-Modus, um herauszufinden, ob der SQLCMD-Modus aktiviert ist ... Ich würde sagen, dass dies nicht richtig funktioniert, wenn der SQLCMD-Modus deaktiviert ist, wie @bernd_k erfahren hat. Wenn jedoch: setvar für SQL entfernt / ersetzt wird, funktioniert es dann.
Oak_3260548
7

Nein.

Sie können jedoch immer im SQLCMD-Modus ausgeführt werden und T-SQL verwenden

Um klar zwischen SQLCMD-Befehlen und Transact-SQL zu unterscheiden, muss allen SQLCMD-Befehlen ein Doppelpunkt (:) vorangestellt werden.

gbn
quelle
Gilt das noch für SQL Server 2012/2014/2016?
John aka hot2use
1
@ hot2use: Ja, ich habe es am 2014/2016
gbn