In dit artikel ga ik een constructie geven voor het verwijderen van een object voordat het wordt gemaakt.

In ons team werken zo'n twintig SQL Ninja-ontwikkelaars. Ze beschrijven deze constructie allemaal op verschillende manieren.
Ons team bestaat uit zo'n twintig SQL Ninja's en ze gebruiken allemaal het volgende statement op een andere manier:
IF OBJECT_ID('dbo.Function', 'TF') IS NOT NULL
DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function .. Of:
IF EXISTS (
SELECT *
FROM sys.objects
WHERE name = 'Procedure'
AND type = 'P'
)
DROP PROCEDURE dbo.Procedure;
GO
CREATE PROCEDURE dbo.Procedure .. Of:
IF EXISTS (
SELECT 1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'dbo.Function')
AND type IN (N'FN', N'IF', N'TF', N'FS', N'FT')
)
DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function .. Op StackOverflow vonden gebruikers deze versie leuk:
IF EXISTS (
SELECT * FROM sysobjects WHERE id = object_id(N'function_name')
AND xtype IN (N'FN', N'IF', N'TF')
)
DROP FUNCTION function_name
GO De sterren zijn uitgelijnd en ik vond een passende implementatie in een van de SQL-sites. In het begin was ik geschokt, maar toen hielpen mensen in te zien waarom het goed werkt.
IF OBJECT_ID('dbo.Function', 'TF') IS NULL
EXEC('CREATE FUNCTION dbo.Function() RETURNS @t TABLE(i INT) BEGIN RETURN END');
GO
ALTER FUNCTION dbo.Function .. Het punt is dat als u elke keer de DROP- en CREATE-instructies gebruikt, u objectmachtigingen verwijdert. Bovendien kan het object zich in de replicatie bevinden en wordt het ook verwijderd zodra het opnieuw is gemaakt.
Dus ik vond deze versie leuk en besloot het in de dbo.antidrop . te stoppen procedure.
De procedure heeft slechts twee argumenten:objectnaam en zijn type. Voer de volgende instructie uit om het objecttype te controleren:
SELECT type FROM sys.objects WHERE name = 'Name'
Hier is hoe het eruit zal zien:
EXEC dbo.antidrop('dbo.Name', 'FN');
GO
ALTER FUNCTION dbo.Name .. Ten slotte is de code van de procedure als volgt:
IF OBJECT_ID('dbo.antidrop', 'P') IS NULL
EXEC('CREATE PROC dbo.antidrop AS');
GO
CREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAME
AS
BEGIN
DECLARE @if_tf NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE FUNCTION ' + @name + '() RETURNS @t TABLE(i INT) BEGIN RETURN END'');
GO
';
DECLARE @fn NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE FUNCTION ' + @name + '(@i INT) RETURNS INT AS BEGIN RETURN @i + 1 END'');
GO
';
DECLARE @p NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE PROC ' + @name + 'AS'');
GO
';
DECLARE @v NVARCHAR(512) = '
IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
EXEC(''CREATE VIEW ' + @name + ' AS SELECT 1 AS i'');
GO
';
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);
END
END
GO Bedankt voor uw aandacht!