Kan ik de SQLCMD-modus inschakelen vanuit een script?

Is er zoiets als een richtlijn die ik in een script kan gebruiken om SSMS te dwingen de SQLCMD-modus in of uit te schakelen?

Antwoord

Zoals gezegd is er geen “manier.

Maar één ding doen is om een snelle controle in onze scriptkop op te nemen om te bepalen of de SQLCMD-modus is ingeschakeld (en het script te beëindigen als dat niet het geval is):

: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 

Er is een reden waarom Severity 20 wordt gebruikt, heeft het de neiging de verbinding onmiddellijk te verbreken, waardoor wordt voorkomen dat er meer scriptcode wordt uitgevoerd, zelfs als er GO batch-terminators later in het script zijn.

Ernst 20-24 :

geven systeemproblemen aan en zijn fatale fouten, wat betekent dat de Database Engine-taak die een instructie of batch uitvoert, niet langer actief is. De taak registreert informatie over wat er is gebeurd en wordt vervolgens beëindigd. In de meeste gevallen de applicatieverbinding met de instantie van de database-engine kan ook beëindigen. Als dit gebeurt, is afhankelijk van het probleem em, kan de toepassing mogelijk geen verbinding maken.

Foutmeldingen in dit bereik kunnen van invloed zijn op alle processen die toegang hebben tot gegevens in dezelfde database en kunnen erop duiden dat een database of object is beschadigd. Foutmeldingen met een prioriteitsniveau van 19 tot en met 24 worden naar het foutenlogboek geschreven.

Reacties

  • Voor ssms zouden de eerste 2 regels voldoende zijn en voor sql 2000 Query Analyzer werkt het, maar het bericht wordt niet weergegeven.
  • Maar ' t de script gewoon doorgaan met uitvoeren vanaf de volgende GO?
  • Zoals hier vermeld, kunt u ook SET NOEXEC ON als een extra veiligheidsmaatregel om te voorkomen dat iets anders in het script wordt uitgevoerd.
  • @Dan Nolan: Ik snap het, op de een of andere manier miste ik het punt van de derde regel. Dus als ik het goed begrijp, is er ' geen oplossing om de SQLCMD-modus uit te schakelen. Het zal in wezen incorrect syntax near ':' weergeven vanwege :setvar aan het begin …
  • @youcantryreachingme RAISERROR prioriteitsniveau 20 (en hoger) wordt door SQL beschouwd als een fatale fout, waardoor de verbinding onmiddellijk wordt verbroken, dus geen verdere batches (zelfs niet de SET NOEXEC ON) wordt uitgevoerd. De reden waarom de NOEXEC -instructies er zijn, is om de situatie te dekken waarin de uitvoerende gebruiker geen sysadmin / privileges, die nodig zijn om fatale fouten te maken.

Antwoord

Nee. / p>

Maar je kunt altijd in SQLCMD-modus draaien en T-SQL erin hebben

Om een duidelijk onderscheid te maken tussen SQLCMD-opdrachten en Transact-SQL, moeten alle SQLCMD-opdrachten worden voorafgegaan door een dubbele punt (:).

Reacties

  • Is dit nog steeds geldig voor SQL Server 2012/2014/2016?
  • @ hot2use: Ja, ik ' heb het gebruikt in 2014/2016

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *