Vielen Dank an alle anderen Leute hier und andere Beiträge, die ich gelesen habe. Aber nichts hat alle meine Bedürfnisse erfüllt, bis @jaraics geantwortet hat.
In den meisten Antworten, die ich gesehen habe, werden Skripte mit mehreren Chargen nicht berücksichtigt. Und sie ignorieren die doppelte Verwendung in SSMS und SQLCMD. Mein Skript ist in SSMS vollständig ausführbar - aber ich möchte, dass F5 verhindert, dass eine bestehende Gruppe von Objekten versehentlich entfernt wird.
SET PARSEONLY ON
gut genug funktioniert, um unerwünschte F5 zu verhindern. Aber dann können Sie nicht mit SQLCMD laufen.
Eine andere Sache, die mich eine Zeit lang gebremst hat, ist die Art und Weise, wie ein Batch alle weiteren Befehle überspringt, wenn ein Fehler auftritt - also meine SET NOCOUNT ON
übersprungen wurde und das Skript somit weiterlief.
Wie auch immer, ich habe die Antwort von Jaraics ein wenig abgewandelt: (in diesem Fall brauche ich auch eine Datenbank, die über die Kommandozeile aktiv ist)
-----------------------------------------------------------------------
-- Prevent accidental F5
-- Options:
-- 1) Highlight everything below here to run
-- 2) Disable this safety guard
-- 3) or use SQLCMD
-----------------------------------------------------------------------
set NOEXEC OFF -- Reset in case it got stuck ON
set CONTEXT_INFO 0x1 -- A 'variable' that can pass batch boundaries
GO -- important !
if $(SQLCMDDBNAME) is not null
set CONTEXT_INFO 0x2 -- If above line worked, we're in SQLCMD mode
GO -- important !
if CONTEXT_INFO()<>0x2
begin
select 'F5 Pressed accidentally.'
SET NOEXEC ON -- skip rest of script
END
GO -- important !
-----------------------------------------------------------------------
< rest of script . . . . . >
GO
SET NOEXEC OFF
print 'DONE'