Er det noe sånt som et direktiv som jeg kan bruke i et skript for å tvinge SSMS til å aktivere / deaktivere SQLCMD-modus?
Svar
Som det er sagt, er det ingen måte.
Imidlertid er en ting vi gjør er å inkludere en rask sjekk i skriptoverskriften vår for å avgjøre om SQLCMD-modus er på (og avslutte skriptet 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
Det er en grunn Alvorlighetsgrad 20 brukes, har den en tendens til å drepe forbindelsen umiddelbart, og forhindrer at flere skriptkoder kjører, selv om det er GO
batchterminatorer senere i skriptet.
Angi systemproblemer og er fatale feil, som betyr at databasemotoroppgaven som kjører en setning eller batch ikke lenger kjører. Oppgaven registrerer informasjon om hva som skjedde og deretter avsluttes. I de fleste tilfeller applikasjonstilkoblingen til forekomsten av databasemotoren kan også avslutte . Hvis dette skjer, avhengig av problemet em, kan det hende at applikasjonen ikke kan koble til på nytt.
Feilmeldinger i dette området kan påvirke alle prosessene som får tilgang til data i samme database, og kan indikere at en database eller et objekt er skadet. Feilmeldinger med alvorlighetsnivå fra 19 til 24 skrives til feilloggen.
Kommentarer
Svar
Nei
Men du kan alltid kjøre i SQLCMD-modus og ha T-SQL i det skjønt
For å gjøre et klart skille mellom SQLCMD-kommandoer og Transact-SQL, må alle SQLCMD-kommandoer være foran et kolon (:).
Kommentarer
- Er dette fortsatt gyldig for SQL Server 2012/2014/2016?
- @ hot2use: Ja, jeg ' har brukt det 2014/2016
SET NOEXEC ON
som et ekstra sikkerhetstiltak for å forhindre at noe annet i skriptet kjører.incorrect syntax near ':'
på grunn av:setvar
i begynnelsen …RAISERROR
alvorlighetsgrad 20 (og over) betraktes av SQL som en fatal feil, noe som resulterer i at forbindelsen blir droppet umiddelbart, og derfor ikke flere batcher (ikke engangSET NOEXEC ON
) utføres. Årsaken til atNOEXEC
utsagnene er der, er for å dekke situasjonen der den utførende brukeren ikke harsysadmin
/ALTER TRACE
privilegier, som er nødvendige for å få fatale feil.