Neulich fragte mich ein Kollege, ob es sicherer sei die Existenz von Prozeduren auf herkömmliche Art zu prüfen und dann ggf. zu löschen:

IF schema_id('DDLMaster') IS NULL
EXEC ('CREATE SCHEMA [DDLMaster];');
go
IF object_id('[DDLMaster].[p_version]') IS NOT NULL
DROP PROCEDURE [DDLMaster].[p_version];
go
CREATE PROCEDURE [DDLMaster].[p_version]
AS
SELECT @@version

Oder doch einfach mal testweise zu löschen:

BEGIN TRY DROP PROCEDURE [DDLMaster].[p_version] END TRY
BEGIN CATCH END CATCH
go
CREATE PROCEDURE [DDLMaster].[p_version]
AS
SELECT @@version

Ich muss ehrlich sagen, dass ich keine Ahnung habe, was besser ist. Risiken und Nebenwirkungen sind auch gleich verteilt. Für mich ist es daher einfach Geschmackssache.

Die letzte Art sah ich erstmals bei meinem Kollegen Diethard vor ein paar Jahren und fand sie gleich sympatisch. Einfach weil das so abgedreht ist. Dennoch verwende ich immer noch die gute alte Überprüfung mittels IF. Im Normalfall sind bei unseren Skripten die Objekte schon da und daher dürfte die zweite Methode einen Tick schneller sein. Andererseits sind die SQL-Server heutzutage so schnell, dass wir hier über wenige Millisekunden reden… 😉

Beide Tricks gehen übrigens auch für andere Datenbank-Objekte.