Pot activa modul SQLCMD din interiorul unui script?

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.

Severități 20-24 :

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

  • Pentru ssms primele 2 linii ar fi suficiente și pentru sql 2000 Query Analyzer funcționează, dar mesajul nu este afișat.
  • Dar nu ar ' t scriptul continuă să se execute din următorul GO?
  • După cum sa menționat aici , puteți seta și SET NOEXEC ON ca o măsură de siguranță adăugată pentru a împiedica să se execute orice altceva din script.
  • @Dan Nolan: Înțeleg, cumva am ratat punctul al treilea rând. Deci, dacă înțeleg corect, nu există ' nicio soluție pentru a acoperi modul SQLCMD dezactivat. În esență, va apărea incorrect syntax near ':' din cauza :setvar la început …
  • @youcantryreachingme 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ăcar SET NOEXEC ON) este executat. Motivul pentru care există declarațiile NOEXEC este acela de a acoperi situația în care utilizatorul executant nu are sysadmin / ALTER TRACE privilegii, care sunt necesare pentru ridicarea erorilor fatale.

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *