Kan jeg aktivere SQLCMD-tilstand inde i et script?

Er der noget i retning af et direktiv, som jeg kan bruge i et script til at tvinge SSMS til at aktivere / deaktivere SQLCMD-tilstand?

Svar

Som sagt er der ingen måde.

Imidlertid er en ting vi gør er at medtage en hurtig kontrol i vores scriptoverskrift for at afgøre, om SQLCMD-tilstand er aktiveret (og afslutte scriptet, hvis ikke):

: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 

Der er en grund Alvorlighed 20 bruges, har det en tendens til at slå forbindelsen med det samme, hvilket forhindrer, at flere scriptkoder kører, selvom der er GO batchterminatorer senere i scriptet.

Severities 20-24 :

Angiv systemproblemer og er fatale fejl, hvilket betyder, at databasemotoropgaven, der udfører en erklæring eller batch, ikke længere kører. Opgaven registrerer oplysninger om, hvad der opstod og derefter afsluttes. forekomsten af databasemotoren kan også afslutte . Hvis dette sker, afhængigt af problemet em, er applikationen muligvis ikke i stand til at oprette forbindelse igen.

Fejlmeddelelser i dette interval kan påvirke alle de processer, der får adgang til data i den samme database, og kan indikere, at en database eller et objekt er beskadiget. Fejlmeddelelser med et alvorlighedsniveau fra 19 til 24 skrives til fejlloggen.

Kommentarer

  • For ssms ville de første 2 linjer være nok, og for SQL 2000 Query Analyzer fungerer det, men meddelelsen vises ikke.
  • Men ville ikke ' t script bare fortsætte med at udføre fra næste GO?
  • Som nævnt her , kan du også indstille SET NOEXEC ON som en ekstra sikkerhedsforanstaltning for at forhindre, at andet i scriptet kører.
  • @Dan Nolan: Jeg kan se, på en eller anden måde savnede jeg punktet på 3. linje. Så hvis jeg forstår det korrekt, er ' ingen løsning til at dække SQLCMD-tilstand fra. Det viser i det væsentlige incorrect syntax near ':' på grund af :setvar i starten …
  • @youcantryreachingme RAISERROR sværhedsgrad 20 (og derover) betragtes af SQL som en fatal fejl, hvilket resulterer i, at forbindelsen slettes med det samme, derfor ikke yderligere batcher (ikke engang SET NOEXEC ON) udføres. Årsagen til, at NOEXEC udsagnene er der, er for at dække situationen, hvor den udførende bruger ikke har sysadmin / ALTER TRACE privilegier, som er nødvendige for at rejse fatale fejl.

Svar

Nej

Men du kan altid køre i SQLCMD-tilstand og have T-SQL i det selvom

For at gøre en klar sondring mellem SQLCMD-kommandoer og Transact-SQL skal alle SQLCMD-kommandoer have forud for et kolon (:).

Kommentarer

  • Er dette stadig gyldigt til SQL Server 2012/2014/2016?
  • @ hot2use: Ja, jeg ' har brugt det 2014/2016

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *