Czy mogę włączyć tryb SQLCMD z poziomu skryptu?

17

Czy istnieje coś takiego jak dyrektywa, której można użyć w skrypcie, aby zmusić SSMS do włączenia / wyłączenia trybu SQLCMD?

bernd_k
źródło

Odpowiedzi:

17

Jak już powiedziano, nie ma sposobu.

Jedną z rzeczy, które robimy, jest szybkie sprawdzenie w nagłówku skryptu, aby ustalić, czy tryb SQLCMD jest włączony (i zakończyć skrypt, jeśli nie):

: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

Jest powód, dla którego używany jest wskaźnik ważności 20, który ma tendencję do natychmiastowego GOprzerywania połączenia, co uniemożliwia uruchomienie dodatkowego kodu skryptu, nawet jeśli w skrypcie znajdują się terminatory wsadowe.

Istotności 20–24 :

Wskazują problemy systemowe i są to błędy krytyczne, co oznacza, że ​​zadanie aparatu bazy danych, które wykonuje instrukcję lub partia, nie jest już uruchomione. Zadanie rejestruje informacje o tym, co się wydarzyło, a następnie zostaje zakończone. W większości przypadków połączenie aplikacji z instancją aparatu bazy danych może również zostać zakończone . Jeśli tak się stanie, w zależności od problemu aplikacja może nie być w stanie połączyć się ponownie.

Komunikaty o błędach w tym zakresie mogą wpływać na wszystkie procesy uzyskujące dostęp do danych w tej samej bazie danych i mogą wskazywać na uszkodzenie bazy danych lub obiektu. Komunikaty błędów o poziomie ważności od 19 do 24 są zapisywane w dzienniku błędów.

Dan Nolan
źródło
Dla ssms wystarczą pierwsze 2 linie, a dla SQL 2000 Query Analyzer działa, ale komunikat nie jest wyświetlany.
bernd_k
Ale czy skrypt nie będzie kontynuował wykonywania od następnego GO?
Dan Nolan,
Używam SSMS 2008 R2 i tam 2 linie produkują: Meldung 102, Ebene 15, Status 1, Zeile 1 Niepoprawna składnia w pobliżu „:”. Korzystając z SQL Server 2000 Query Analyzer, musisz użyć RAISERROR.
bernd_k
4
Jak wspomniano tutaj , można również ustawić SET NOEXEC ONjako dodatkowy środek bezpieczeństwa, aby zapobiec uruchomieniu wszystkiego innego w skrypcie.
Yahoo Poważny
Hmm, to używa trybu SQLCMD, aby dowiedzieć się, czy tryb SQLCMD jest włączony ... Powiedziałbym, że nie będzie działał poprawnie, gdy tryb SQLCMD jest wyłączony, jak to zaobserwował @bernd_k. Jeśli jednak: setvar zostanie usunięty / zastąpiony dla SQL, to będzie działać.
Oak_3260548
7

Nie.

Ale zawsze możesz działać w trybie SQLCMD i mieć w nim T-SQL

Aby wprowadzić wyraźne rozróżnienie między poleceniami SQLCMD a Transact-SQL, wszystkie polecenia SQLCMD muszą być poprzedzone dwukropkiem (:).

gbn
źródło
Czy nadal obowiązuje to dla SQL Server 2012/2014/2016?
John aka hot2use
1
@ hot2use: Tak, użyłem go w dniu 2014/2016
gbn