В тази статия ще предоставя конструкция за изтриване на обект, преди да го създам.
В нашия екип има около двадесет разработчици на SQL Ninja. Всички те описват тази конструкция по различни начини.
Нашият екип се състои от около двадесет SQL Ninjas и всички те използват следното изявление по различен начин:
АКО OBJECT_ID('dbo.Function', 'TF') НЕ Е NULL DROP FUNCTION dbo.Function;GOCREATE FUNCTION dbo.Function ..
Или:
АКО СЪЩЕСТВУВА ( SELECT * FROM sys.objects WHERE name ='Procedure' AND type ='P' ) DROP PROCEDURE dbo.Procedure;GOCREATE PROCEDURE dbo.Procedure ..
Или:
АКО СЪЩЕСТВУВА ( ИЗБЕРЕТЕ 1 ОТ sys.objects WHERE object_id =OBJECT_ID(N'dbo.Function') И въведете IN (N'FN', N'IF', N'TF', N'FS', N' FT')) DROP FUNCTION dbo.Function;GOCREATE FUNCTION dbo.Function ..
В StackOverflow потребителите харесаха тази версия:
АКО СЪЩЕСТВУВА ( SELECT * FROM sysobjects WHERE id =object_id(N'function_name') И xtype IN (N'FN', N'IF', N'TF')) DROP FUNCTION function_nameGO
Звездите са подравнени и намерих подходяща реализация в един от SQL сайтовете. Първоначално бях шокиран, но след това хората помогнаха да разберат защо работи добре.
АКО OBJECT_ID('dbo.Function', 'TF') Е NULL EXEC('CREATE FUNCTION dbo.Function() ВРЪЩА @t TABLE(i INT) BEGIN RETURN END');GOALTER FUNCTION dbo.Function ..предварително>Въпросът е, че ако използвате операторите DROP и CREATE всеки път, тогава изтривате разрешенията за обект. В допълнение, обектът може да бъде в репликацията и той също ще бъде изтрит, след като бъде създаден отново.
И така, харесах тази версия и реших да я опакова в dbo.antidrop процедура.
Процедурата приема само два аргумента:име на обект и неговия тип. За да проверите типа обект, изпълнете следния оператор:
ИЗБЕРЕТЕ тип FROM sys.objects WHERE name ='Име'Ето как ще изглежда:
EXEC dbo.antidrop('dbo.Name', 'FN'); GOALTER FUNCTION dbo.Name ..И накрая, кодът на процедурата е както следва:
АКО OBJECT_ID('dbo.antidrop', 'P') Е NULL EXEC('CREATE PROC dbo.antidrop AS');GOCREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAMEASBEGIN ДЕКЛАРИРАНЕ @if_tf NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''CREATE FUNCTION ' + @name + '() ВРЪЩА @t TABLE(i INT) НАЧАЛО ВРЪЩАНЕ КРАЙ''); ОТИВАМ '; ДЕКЛАРИРАНЕ @fn NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''СЪЗДАВАНЕ НА ФУНКЦИЯ ' + @name + '(@ i INT) ВРЪЩА INT КАТО НАЧАЛО RETURN @i + 1 END''); ОТИВАМ '; DECLARE @p NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''CREATE PROC ' + @name + 'AS' '); ОТИВАМ '; DECLARE @v NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''CREATE VIEW ' + @name + ' КАТО SELECT 1 AS i''); ОТИВАМ '; IF @type in (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); ENDENDGOБлагодаря ви за вниманието!