2011-02-25 13 views
17

में एकाधिक डेटाबेस कैसे छोड़ें बस स्पष्ट करने के लिए, वास्तव में कोई प्रश्न नहीं है, मेरे जैसे लोगों के लिए कुछ और मदद जो उत्तर की तलाश में थे।
बहुत सारे एप्लिकेशन अस्थायी तालिकाओं और समान बनाते हैं, लेकिन मुझे आश्चर्य हुआ जब टीम फाउंडेशन सर्वर ने मेरे परीक्षण SQL सर्वर पर 80+ डेटाबेस बनाए। टीएफएस सही ढंग से स्थापित नहीं हुआ था, और कृपया इसके बाद मुझे साफ़ करने के लिए छोड़ दिया।SQL सर्वर

CREATE TABLE #databaseNames (name varchar(100) NOT NULL, db_size varchar(50), owner varchar(50), dbid int, created date, status text, compatibility_level int); 
INSERT #databaseNames 
    exec sp_helpdb; 

DECLARE dropCur CURSOR FOR 
    SELECT name FROM #databaseNames WHERE name like '_database_name_%'; 
OPEN dropCur; 
DECLARE @dbName nvarchar(100); 
FETCH NEXT FROM dropCur INTO @dbName; 
DECLARE @statement nvarchar(200); 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @statement = 'DROP DATABASE ' + @dbName; 
    EXEC sp_executesql @statement; 
    FETCH NEXT FROM dropCur INTO @dbName; 
END 
CLOSE dropCur; 
DEALLOCATE dropCur; 
DROP TABLE #databaseNames; 

यह बिना चला जाता है: चूंकि प्रत्येक डेटाबेस एक नामकरण परंपरा थी, बजाय हाथ से प्रत्येक डेटाबेस को हटाने, मैं कैसे कर्सर का उपयोग करने और जो लिखा है उसे मैं T-SQL कभी का सबसे मूर्ख टुकड़ा होने के लिए देखने को याद कह रहे हैं कि इस तरह के कर्सर का उपयोग शायद वास्तव में खतरनाक है, और अत्यधिक सावधानी के साथ इस्तेमाल किया जाना चाहिए। यह मेरे लिए काम करता है, और मैंने अभी तक अपने डेटाबेस को और कोई नुकसान नहीं देखा है, लेकिन मैं अस्वीकार करता हूं: इस कोड का उपयोग अपने जोखिम पर करें, और पहले अपने महत्वपूर्ण डेटा का बैकअप लें!
इसके अलावा, अगर इसे हटाया जाना चाहिए क्योंकि यह कोई सवाल नहीं है, तो मैं समझता हूं। बस इसे कहीं पोस्ट करना चाहते थे लोग देखेंगे।

+1

आप अपनी खुद की सवालों के जवाब देने की अनुमति है, तो यह बेहतर हो सकता है प्रश्न को एक वास्तविक प्रश्न में फिर से लिखने के लिए (अपने विशेष परिस्थिति के मामले में इसे वाक्यांश करने का प्रयास करें, और सामान्य समस्या यह फिट बैठती है), फिर स्क्रिप्ट को उत्तर के रूप में पोस्ट करें। –

उत्तर

20

इस आसान है ...

use master 
go 
declare @dbnames nvarchar(max) 
declare @statement nvarchar(max) 
set @dbnames = '' 
set @statement = '' 
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases where name like 'name.of.db%' 
if len(@dbnames) = 0 
    begin 
    print 'no databases to drop' 
    end 
else 
    begin 
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames)) 
    print @statement 
    exec sp_executesql @statement 
    end 
+0

बुरा नहीं! अगर मैं इसे फिर से करना चाहता हूं तो मैं इसे ध्यान में रखूंगा! :) – Gargravarr

+0

छोटे सुधार, लेन (@dbnames) तुलना होना चाहिए = 0. इसका परीक्षण किया गया और यह बहुत अच्छा काम करता है। बस अपने डेटाबेस –

+0

के नाम पर समान खंड में पैटर्न को प्रतिस्थापित करें, कोड को ठीक करें :) – SeriousM

45

इसके बजाय ऐसा क्यों न करें?

USE master; 
Go 
SELECT 'DROP DATABASE '+ name 
FROM sys.databases WHERE name like '_database_name_%'; 
GO 

उस परिणामसेट के आउटपुट को कैप्चर करें और फिर इसे किसी अन्य क्वेरी विंडो में पेस्ट करें। फिर इसे चलाओ। यह सब टीएसक्यूएल कर्सर कोड क्यों लिखें?

"यदि आप एक हथौड़ा है, तो सब कुछ एक कील की तरह लग रहा है!" ..

+2

मैन्युअल डेटाबेस ड्रॉप के लिए यह एक अच्छा समाधान है। मेरे पास परीक्षण के दौरान उत्पन्न बहुत सारे डेटाबेस हैं, और जब मैं परीक्षण चलाने को रोकता हूं तो मैं आम तौर पर 10-20 डेटाबेस के साथ समाप्त होता हूं। इस आउटपुट को उत्पन्न करने से मुझे आसानी से समीक्षा करने में मदद मिलती है कि क्या छोड़ा जाएगा। मैं केवल डीबी नामों में विशेष पात्रों को लेने के लिए आउटपुट को 'चयन' ड्रॉप डाटाबेस ['+ नाम +'] '' में संशोधित करने का सुझाव दूंगा, जो एक ऐसा फिक्स था जिसे मुझे करने की आवश्यकता थी। – nohwnd

+0

इसके साथ समस्या यह है कि यदि आप हटाने से पहले कनेक्शन बंद नहीं करते हैं, तो विलोपन में कुछ समय लग सकता है भले ही आप पूर्ण कनेक्शन की परवाह न करें। – Tarik

+0

मैं इसे भी उधार लेगा, '"जब आपके पास हथौड़ा होता है, तो सब कुछ नाखून जैसा दिखता है!" .. –