V tomto článku poskytnu konstrukci pro odstranění objektu před jeho vytvořením.
V našem týmu je asi dvacet vývojářů SQL Ninja. Všechny popisují tuto konstrukci různými způsoby.
Náš tým se skládá z asi dvaceti SQL ninjů a všichni používají následující příkaz jiným způsobem:
IF OBJECT_ID('dbo.Function', 'TF') NENÍ NULL FUNKCE DROP dbo.Function;GOCREATE FUNCTION dbo.Function ..
Nebo:
POKUD EXISTUJE ( SELECT * FROM sys.objects WHERE name ='Procedure' AND type ='P' ) DROP PROCEDURE dbo.Procedure;GOCREATE PROCEDURE dbo.Procedure ..
Nebo:
IF EXISTS ( SELECT 1 FROM sys.objects WHERE object_id =OBJECT_ID(N'dbo.Function') A zadejte IN (N'FN', N'IF', N'TF', N'FS', N' FT')) DROP FUNCTION dbo.Function;GOCREATE FUNCTION dbo.Function ..
Na StackOverflow se uživatelům líbila tato verze:
IF EXISTS ( SELECT * FROM sysobjects WHERE id =object_id(N'function_name') AND xtype IN (N'FN', N'IF', N'TF')) DROP FUNCTION function_nameGO
Hvězdičky jsou zarovnány a na jednom z SQL stránek jsem našel vhodnou implementaci. Nejprve jsem byl šokován, ale pak mi lidé pomohli pochopit, proč to funguje dobře.
IF OBJECT_ID('dbo.Function', 'TF') JE NULL EXEC('CREATE FUNCTION dbo.Function() VRACÍ @t TABLE(i INT) ZAČÁTEK NÁVRAT END');FUNKCE BRANKA dbo.Function ..Jde o to, že pokud pokaždé použijete příkazy DROP a CREATE, odstraníte oprávnění k objektu. Kromě toho může být objekt v replikaci a po opětovném vytvoření bude rovněž odstraněn.
Takže se mi tato verze líbila a rozhodl jsem se ji zabalit do dbo.antidrop postup.
Procedura má pouze dva argumenty:název objektu a jeho typ. Chcete-li zkontrolovat typ objektu, proveďte následující příkaz:
SELECT typ FROM sys.objects WHERE name ='Name'Zde je návod, jak to bude vypadat:
EXEC dbo.antidrop('dbo.Name', 'FN');FUNKCE BRANKA dbo.Name ..Nakonec je kód procedury následující:
IF OBJECT_ID('dbo.antidrop', 'P') JE NULL EXEC('CREATE PROC dbo.antidrop AS');GOCREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAMEASBEGIN DECLARE @if_tf NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE FUNCTION ' + @name + '() RETURNS @t TABLE(i INT) ZAČÁTEK NÁVRAT KONEC''); JÍT '; DECLARE @fn NVARCHAR(512) =' POKUD OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE FUNCTION ' + @name + '(@ i INT) VRACÍ INT JAKO ZAČÁTEK RETURN @i + 1 KONEC''); JÍT '; DECLARE @p NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE PROC ' + @name + 'AS' '); JÍT '; DECLARE @v NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE VIEW ' + @name + ' AS SELECT 1 AS i''); JÍT '; IF @zadejte (N'IF', N'TF') BEGIN EXEC(@if_tf); END ELSE IF @type =N'FN' BEGIN EXEC(@fn); END ELSE IF @type =N'P' BEGIN EXEC(@p); END ELSE IF @type =N'V' BEGIN EXEC(@v); ENDENDGODěkuji za pozornost!