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