इस लेख में, मैं किसी वस्तु को बनाने से पहले उसे हटाने के लिए एक निर्माण प्रदान करने जा रहा हूँ।

हमारी टीम में लगभग बीस SQL निंजा डेवलपर हैं। वे सभी इस निर्माण का अलग-अलग तरीकों से वर्णन करते हैं।
हमारी टीम में लगभग बीस SQL निन्जा शामिल हैं और वे सभी निम्नलिखित कथन का अलग तरीके से उपयोग करते हैं:
IF OBJECT_ID('dbo.Function', 'TF') IS NOT NULL
DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function .. या:
IF EXISTS (
SELECT *
FROM sys.objects
WHERE name = 'Procedure'
AND type = 'P'
)
DROP PROCEDURE dbo.Procedure;
GO
CREATE PROCEDURE dbo.Procedure .. या:
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 .. StackOverflow पर, उपयोगकर्ताओं को यह संस्करण पसंद आया:
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 सितारों को संरेखित किया गया है और मुझे SQL साइटों में से एक में उपयुक्त कार्यान्वयन मिला है। सबसे पहले, मैं चौंक गया, लेकिन फिर लोगों ने यह देखने में मदद की कि यह अच्छा क्यों काम करता है।
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 .. मुद्दा यह है कि यदि आप हर बार DROP और CREATE स्टेटमेंट का उपयोग करते हैं, तो आप ऑब्जेक्ट अनुमतियों को हटा देते हैं। इसके अलावा, ऑब्जेक्ट प्रतिकृति में हो सकता है और इसे फिर से बनाए जाने के बाद भी हटा दिया जाएगा।
इसलिए, मुझे यह संस्करण पसंद आया और मैंने इसे dbo.antidrop . में लपेटने का निर्णय लिया प्रक्रिया।
प्रक्रिया में केवल दो तर्क होते हैं:वस्तु का नाम और उसका प्रकार। ऑब्जेक्ट प्रकार की जांच करने के लिए, निम्नलिखित कथन निष्पादित करें:
SELECT type FROM sys.objects WHERE name = 'Name'
यह इस तरह दिखेगा:
EXEC dbo.antidrop('dbo.Name', 'FN');
GO
ALTER FUNCTION dbo.Name .. अंत में, प्रक्रिया का कोड इस प्रकार है:
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 ध्यान देने के लिए धन्यवाद!