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.
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
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
SET NOEXEC ONjako dodatkowy środek bezpieczeństwa, aby zapobiec uruchomieniu czegokolwiek innego w skrypcie.incorrect syntax near ':'z powodu:setvarna początku …RAISERRORpoziom 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 (nawetSET NOEXEC ON) jest wykonywany. Powodem, dla którego istnieją instrukcjeNOEXEC, jest sytuacja, w której wykonujący użytkownik nie masysadmin/ALTER TRACEuprawnienia, które są potrzebne do zgłaszania krytycznych błędów.