it-swarm.dev

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

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

17
bernd_k

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 jest):

: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 przerywania połączenia, uniemożliwiając uruchomienie dodatkowego kodu skryptu, nawet jeśli w skrypcie znajdują się GO terminatory wsadowe.

Istotność 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.

17
Dan Nolan

Nie.

Ale zawsze możesz działać w trybie tryb 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 (:).

7
gbn