कुछ उपसर्ग के साथ और वैकल्पिक रूप से निश्चित स्कीमा से शुरू सभी वस्तुओं को हटाने के लिए एक विकल्प शामिल किया है। वैसे, मैंने डिफ़ॉल्ट रूप से sysobjects पर संग्रहीत सभी प्रकार प्राप्त करने के लिए अतिरिक्त क्वेरी जोड़ा।
मैं GitHub करने के लिए पूरे नमूना स्क्रिप्ट अपलोड कर दिया है: DropAll_Dnn_Objects.sql
भाग 1: अस्थायी संग्रहित प्रक्रिया:
IF OBJECT_ID('_temp_DropAllDnnObjects') IS NOT NULL
DROP PROCEDURE _temp_DropAllDnnObjects;
GO
CREATE PROCEDURE _temp_DropAllDnnObjects
@object_prefix NVARCHAR(30),
@schema_name sysname = NULL
AS
BEGIN
DECLARE @sname sysname, @name sysname, @type NVARCHAR(30)
DECLARE @object_type NVARCHAR(255), @sql NVARCHAR(2000), @count INT = 0
DECLARE curs CURSOR FOR
SELECT sname, [name], xtype
FROM (
SELECT SCHEMA_NAME(schema_id) as sname, [name], [type] as xtype
FROM sys.objects
WHERE [type] IN ('U', 'P', 'FN', 'IF', 'TF', 'V', 'TR')
AND name LIKE @object_prefix + '%'
AND (@schema_name IS NULL OR schema_id = SCHEMA_ID(@schema_name))
UNION ALL
SELECT SCHEMA_NAME(schema_id) as sname, [name], 'TYPE' as xtype
FROM sys.types
WHERE is_user_defined = 1
AND [name] LIKE @object_prefix + '%'
AND (@schema_name IS NULL OR schema_id = SCHEMA_ID(@schema_name))
) a
ORDER BY CASE xtype
WHEN 'P' THEN 1
WHEN 'FN' THEN 2
WHEN 'IF' THEN 3
WHEN 'TF' THEN 4
WHEN 'TR' THEN 5
WHEN 'V' THEN 6
WHEN 'U' THEN 7
WHEN 'TYPE' THEN 8
ELSE 9
END, name
OPEN curs;
FETCH NEXT FROM curs INTO @sname, @name, @type;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @count = @count + 1
-- Configuration point 2
SET @object_type = CASE @type
WHEN 'P' THEN 'PROCEDURE'
WHEN 'FN' THEN 'FUNCTION'
WHEN 'IF' THEN 'FUNCTION'
WHEN 'TF' THEN 'FUNCTION'
WHEN 'TR' THEN 'TRIGGER'
WHEN 'V' THEN 'VIEW'
WHEN 'U' THEN 'TABLE'
WHEN 'TYPE' THEN 'TYPE'
END
SET @sql = REPLACE(REPLACE(REPLACE('DROP <TYPE> [<SCHEMA>].[<NAME>];',
'<TYPE>', @object_type),
'<SCHEMA>', @sname),
'<NAME>', @name)
BEGIN TRY
PRINT @sql
EXEC(@sql)
END TRY
BEGIN CATCH
PRINT 'ERROR: ' + ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM curs INTO @sname, @name, @type;
END;
PRINT CONCAT('Objects Found: ', @Count)
PRINT ''
PRINT '------------------------------------------------------'
PRINT ''
CLOSE curs;
DEALLOCATE curs;
RETURN @Count
END;
GO
यह त्रुटियों पर जारी रहेगा (और त्रुटि संदेश प्रदर्शित)। यह पाए गए सभी वस्तुओं की गिनती वापस कर देगा।
भाग 2: मानकों के साथ प्रक्रिया संग्रहित कॉल:
आप इस प्रकार आदेश आदेश को चलाने के लिए थोड़ी देर के पाश बना सकते हैं जब तक कि कोई वस्तु (निर्भरता) छोड़ दिया है,:
DECLARE @count INT = 1
WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'dnn';
SET @count = 1
WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'aspnet';
SET @count = 1
WHILE @count > 0 EXEC @count = _temp_DropAllDnnObjects 'vw_aspnet';
GO
भाग 3 : अंत में, प्रक्रिया से छुटकारा पाएं:
IF OBJECT_ID('_temp_DropAllDnnObjects') IS NOT NULL
DROP PROCEDURE _temp_DropAllDnnObjects;
GO
SearchObjectsForText संग्रहीत प्रक्रिया के लेआउट के कारण मैं इस विधि का उपयोग कर समाप्त हुआ। लेकिन मुझे "तार विज्ञान" भी पसंद आया क्योंकि यह बहुत आसान था। –
यह इंगित करने लायक है कि यह * एक ही परिणाम नहीं देगा। उदाहरण के लिए, sysobjects सिस्टम कैटलॉग दृश्य वापस कर देगा, जबकि sys.objects –