Finns det något liknande ett direktiv som jag kan använda i ett skript för att tvinga SSMS att aktivera / inaktivera SQLCMD-läge?
Svar
Som sagt, det finns inget sätt.
Men en sak vi göra är att inkludera en snabb kontroll i vårt skriptrubrik för att avgöra om SQLCMD-läget är på (och avsluta skriptet om inte):
: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 finns en anledning Severity 20 används tenderar det att döda anslutningen omedelbart, vilket förhindrar att fler skriptkoder körs, även om det finns GO
batchterminatorer senare i skriptet.
Ange systemproblem och är dödliga fel, vilket innebär att databasmotoruppgiften som kör ett uttalande eller batch inte längre körs. Uppgiften registrerar information om vad som inträffade och avslutas sedan. I de flesta fall applikationsanslutningen till förekomsten av databasmotorn kan också avsluta . Om detta händer, beroende på problemet em, kanske applikationen inte kan ansluta igen.
Felmeddelanden i detta område kan påverka alla processer som får åtkomst till data i samma databas och kan indikera att en databas eller ett objekt är skadat. Felmeddelanden med en allvarlighetsnivå från 19 till 24 skrivs till felloggen.
Kommentarer
Svar
Nej
Men du kan alltid köra i SQLCMD-läge och ha T-SQL i det dock
För att göra en tydlig åtskillnad mellan SQLCMD-kommandon och Transact-SQL måste alla SQLCMD-kommandon prefixas med ett kolon (:).
Kommentarer
- Är detta fortfarande giltigt för SQL Server 2012/2014/2016?
- @ hot2use: Ja, jag ' har använt det 2014/2016
SET NOEXEC ON
som en extra säkerhetsåtgärd för att förhindra att något annat i skriptet körs.incorrect syntax near ':'
på grund av:setvar
i början …RAISERROR
allvarlighetsnivå 20 (och högre) betraktas av SQL som ett dödligt fel, vilket resulterar i att anslutningen tappas omedelbart, därför inga fler satser (inte ensSET NOEXEC ON
) körs. Anledningen till attNOEXEC
uttalandena finns finns för att täcka situationen där den körande användaren inte harsysadmin
/ALTER TRACE
privilegier, som behövs för att få upp fatala fel.