Există ceva de genul unei directive pe care să o pot folosi într-un script pentru a forța SSMS să activeze / dezactiveze modul SQLCMD?
Răspuns
După cum sa spus, nu există o cale.
Cu toate acestea, un lucru faceți este să includeți o verificare rapidă în antetul scriptului nostru, pentru a determina dacă modul SQLCMD este activat (și pentru a opri scriptul dacă nu):
: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
Există un motiv pentru care este utilizată Severitatea 20, tinde să distrugă imediat conexiunea, împiedicând să mai ruleze orice cod de script, chiar dacă există mai multe GO
terminatoare de lot în script.
Indicați problemele de sistem și sunt erori fatale, ceea ce înseamnă că sarcina Motor de baze de date care execută o instrucțiune sau un lot nu mai rulează. Activitatea înregistrează informații despre ceea ce s-a întâmplat și apoi se termină. În majoritatea cazurilor, conexiunea aplicației la instanța Motorului de baze de date poate de asemenea să se încheie . Dacă se întâmplă acest lucru, în funcție de problema em, aplicația s-ar putea să nu se poată reconecta.
Mesajele de eroare din acest interval pot afecta toate procesele care accesează datele din aceeași bază de date și pot indica faptul că o bază de date sau un obiect este deteriorat. Mesajele de eroare cu un nivel de severitate de la 19 la 24 sunt scrise în jurnalul de erori.
Comentarii
Răspuns
Nu
Dar puteți rula oricând în modul SQLCMD și aveți T-SQL în el însă
Pentru a face o distincție clară între comenzile SQLCMD și Transact-SQL, toate comenzile SQLCMD trebuie să fie prefixate cu două puncte (:).
Comentarii
- Este încă valabil pentru SQL Server 2012/2014/2016?
- @ hot2use: Da, eu l-am folosit în 2014/2016
SET NOEXEC ON
ca o măsură de siguranță adăugată pentru a împiedica să se execute orice altceva din script.incorrect syntax near ':'
din cauza:setvar
la început …RAISERROR
nivelul de severitate 20 (și mai mare) este considerat de SQL ca o eroare fatală, ceea ce duce la eliminarea imediată a conexiunii, prin urmare nu mai există alte loturi (nici măcarSET NOEXEC ON
) este executat. Motivul pentru care există declarațiileNOEXEC
este acela de a acoperi situația în care utilizatorul executant nu aresysadmin
/ALTER TRACE
privilegii, care sunt necesare pentru ridicarea erorilor fatale.