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

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

Odpowiedź

Jak już powiedziano, nie ma takiej możliwości.

Jest jednak jedna rzecz, należy dołączyć szybkie sprawdzenie w naszym nagłówku skryptu, aby określić, 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 only see this when SQLCMD mode is on" -- Rest of script goes here GO SET NOEXEC OFF GO 

Jest z powodu użycia Severity 20, ma tendencję do natychmiastowego przerywania połączenia, uniemożliwiając uruchomienie kolejnego kodu skryptu, nawet jeśli w dalszej części skryptu znajdują się terminatory wsadowe GO.

Poziom ważności 20–24 :

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

Komunikaty o błędach z tego zakresu mogą wpływać na wszystkie procesy uzyskujące dostęp do danych w tej samej bazie danych i mogą wskazywać, że baza danych lub obiekt jest uszkodzony. Komunikaty o błędach z poziomem ważności od 19 do 24 są zapisywane w dzienniku błędów.

Komentarze

  • W przypadku ssms wystarczą pierwsze 2 wiersze, a dla sql 2000 Query Analyzer działa, ale komunikat nie jest wyświetlany.
  • Ale czy nie ' t po prostu kontynuować wykonywanie skryptu od następnego GO?
  • Jak wspomniano tutaj , możesz również ustawić SET NOEXEC ON jako dodatkowy środek bezpieczeństwa, aby zapobiec uruchomieniu czegokolwiek innego w skrypcie.
  • @Dan Nolan: Widzę, jakoś przeoczyłem punkt trzeciej linii. Więc jeśli dobrze to rozumiem, ' nie ma rozwiązania pozwalającego wyłączyć tryb SQLCMD. Zasadniczo wyświetli się incorrect syntax near ':' z powodu :setvar na początku …
  • @youcantryreachingme RAISERROR poziom ważności 20 (i wyższy) jest traktowany przez SQL jako błąd krytyczny, co powoduje natychmiastowe zerwanie połączenia, stąd nie ma dalszych partii (nawet SET NOEXEC ON) jest wykonywany. Powodem, dla którego istnieją instrukcje NOEXEC, jest sytuacja, w której wykonujący użytkownik nie ma sysadmin / ALTER TRACE uprawnienia, które są potrzebne do zgłaszania krytycznych błędów.

Odpowiedź

Nie.

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

Aby wyraźnie odróżnić polecenia SQLCMD od języka Transact-SQL, wszystkie polecenia SQLCMD należy poprzedzić dwukropkiem (:).

Komentarze

  • Czy to nadal obowiązuje dla SQL Server 2012/2014/2016?
  • @ hot2use: Tak, użyłem go w dniu 2014/2016

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *