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.
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
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
SET NOEXEC ON
som en ekstra sikkerhedsforanstaltning for at forhindre, at andet i scriptet kører.incorrect syntax near ':'
på grund af:setvar
i starten …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 engangSET NOEXEC ON
) udføres. Årsagen til, atNOEXEC
udsagnene er der, er for at dække situationen, hvor den udførende bruger ikke harsysadmin
/ALTER TRACE
privilegier, som er nødvendige for at rejse fatale fejl.