Kan jag aktivera SQLCMD-läge inifrån ett skript?

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.

Severities 20-24 :

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

  • För ssms skulle de första 2 raderna räcka och för SQL 2000 Query Analyzer fungerar det, men meddelandet visas inte.
  • Men skulle inte ' t skript bara fortsätta att köra från nästa GO?
  • Som nämnts här kan du också ställa in SET NOEXEC ON som en extra säkerhetsåtgärd för att förhindra att något annat i skriptet körs.
  • @Dan Nolan: Jag förstår, på något sätt missade jag punkten på tredje raden. Så om jag förstår det rätt finns ' ingen lösning för att täcka SQLCMD-läget. Den visar i huvudsak incorrect syntax near ':' på grund av :setvar i början …
  • @youcantryreachingme 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 ens SET NOEXEC ON) körs. Anledningen till att NOEXEC uttalandena finns finns för att täcka situationen där den körande användaren inte har sysadmin / ALTER TRACE privilegier, som behövs för att få upp fatala fel.

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *