इस लेख में, मैं किसी वस्तु को बनाने से पहले उसे हटाने के लिए एक निर्माण प्रदान करने जा रहा हूँ।
हमारी टीम में लगभग बीस 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
ध्यान देने के लिए धन्यवाद!