उन सभी तालिकाओं को छोड़ दें जिनके नाम एक निश्चित स्ट्रिंग से शुरू होते हैं


150

मैं उन सभी तालिकाओं को कैसे छोड़ सकता हूं जिनके नाम किसी दिए गए स्ट्रिंग से शुरू होते हैं?

मुझे लगता है कि यह कुछ गतिशील एसक्यूएल और INFORMATION_SCHEMAतालिकाओं के साथ किया जा सकता है ।

जवाबों:


151

डेटाबेस में एक से अधिक होने पर आपको स्वामी को शामिल करने के लिए क्वेरी को संशोधित करने की आवश्यकता हो सकती है।

DECLARE @cmd varchar(4000)
DECLARE cmds CURSOR FOR
SELECT 'drop table [' + Table_Name + ']'
FROM INFORMATION_SCHEMA.TABLES
WHERE Table_Name LIKE 'prefix%'

OPEN cmds
WHILE 1 = 1
BEGIN
    FETCH cmds INTO @cmd
    IF @@fetch_status != 0 BREAK
    EXEC(@cmd)
END
CLOSE cmds;
DEALLOCATE cmds

यह स्क्रिप्ट प्लस रन के दो-चरण दृष्टिकोण का उपयोग करने की तुलना में क्लीनर है। लेकिन स्क्रिप्ट पीढ़ी का एक फायदा यह है कि इससे आपको वास्तव में चलने से पहले क्या चल रहा है इसकी संपूर्णता की समीक्षा करने का मौका मिलता है।

मुझे पता है कि अगर मैं एक प्रोडक्शन डेटाबेस के खिलाफ ऐसा करने जा रहा था, तो मैं यथासंभव सावधान रहूंगा।

कोड नमूना संपादित करें तय।


5
मास्टर और डिटेल टेबल के बीच विदेशी महत्वपूर्ण बाधाओं के कारण आपको इस स्क्रिप्ट को कई बार चलाना पड़ सकता है।
अलेक्जेंडर प्रोकोफ़ेव

7
SQL Server 2005 में मुझे अंतिम दो पंक्तियों को बदलना था close cmds; deallocate cmds
हामिश ग्रुबीजन

चेतावनी : यह समाधान SQL सर्वर द्वारा बनाई गई तालिकाओं को भी हटा सकता है! नीचे दिया गया मेरा समाधान इससे बचा जाता है और विदेशी कुंजी निर्भरता क्रम में तालिकाओं को हटा देता है।
टोनी ओ'हागन

इसने मेरे लिए काम नहीं किया। इस सवाल का जवाब काम किया: stackoverflow.com/questions/5116296/…
आयुष्मती

115
SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

यह एक स्क्रिप्ट उत्पन्न करेगा।

हटाने से पहले तालिका के अस्तित्व की जाँच करने के लिए खंड जोड़ना:

SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

10
आपके लक्ष्य उपसर्ग के साथ "उपसर्ग" को प्रतिस्थापित करते समय मैं कोष्ठक को हटा सकता हूं।
लेविटिकन

10
MYSQL: चयन जानकारी ('DROP टेबल', TABLE_NAME, ";") से डेटा के रूप में INFORMATION_SCHEMA.TABLES जहां TABLE_NAME पसंद है [[उपसर्ग]% '--- उन जैसे जो मुझे यह धागा मिला
आंद्रे

1
परिणाम में दृश्य भी शामिल हैं
Ondra

1
बचना मत भूलना _ अगर यह आपके उपसर्ग का हिस्सा है, जैसे। WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0

3
यह एक स्क्रिप्ट उत्पन्न करता है, लेकिन कोई स्क्रिप्ट को कैसे निष्पादित करता है?
daOnlyBG

16

यह आपको विदेशी कुंजी क्रम में टेबल मिलेगा और SQL सर्वर द्वारा बनाई गई कुछ तालिकाओं को छोड़ने से बचें। t.Ordinalमूल्य निर्भरता परतों में टेबल काट देगा।

WITH TablesCTE(SchemaName, TableName, TableID, Ordinal) AS
(
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
        OBJECT_NAME(so.object_id) AS TableName,
        so.object_id AS TableID,
        0 AS Ordinal
    FROM sys.objects AS so
    WHERE so.type = 'U'
        AND so.is_ms_Shipped = 0
        AND OBJECT_NAME(so.object_id)
        LIKE 'MyPrefix%'

    UNION ALL
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
        OBJECT_NAME(so.object_id) AS TableName,
        so.object_id AS TableID,
        tt.Ordinal + 1 AS Ordinal
    FROM sys.objects AS so
        INNER JOIN sys.foreign_keys AS f
            ON f.parent_object_id = so.object_id
                AND f.parent_object_id != f.referenced_object_id
        INNER JOIN TablesCTE AS tt
            ON f.referenced_object_id = tt.TableID
    WHERE so.type = 'U'
        AND so.is_ms_Shipped = 0
        AND OBJECT_NAME(so.object_id)
        LIKE 'MyPrefix%'
)
SELECT DISTINCT t.Ordinal, t.SchemaName, t.TableName, t.TableID
FROM TablesCTE AS t
    INNER JOIN
    (
        SELECT
            itt.SchemaName AS SchemaName,
            itt.TableName AS TableName,
            itt.TableID AS TableID,
            Max(itt.Ordinal) AS Ordinal
        FROM TablesCTE AS itt
        GROUP BY itt.SchemaName, itt.TableName, itt.TableID
    ) AS tt
        ON t.TableID = tt.TableID
            AND t.Ordinal = tt.Ordinal
ORDER BY t.Ordinal DESC, t.TableName ASC

धन्यवाद करने के लिए stackoverflow.com/questions/352176/...
टोनी ओ'हागन

3
त्वरित सुधार: तालिका नाम WHERE क्लॉज़ में कुछ बार दिखाई देता है और इसे OBJECT_NAME (so.object_id) से बदला जाना चाहिए। अच्छी स्क्रिप्ट!
विटपनेस

6

Oracle XE पर यह काम करता है:

SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

या यदि आप बाधाओं को दूर करना चाहते हैं और अंतरिक्ष को खाली करना चाहते हैं , तो इसका उपयोग करें:

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

जो DROP TABLE cascade constraints PURGEबयानों का एक समूह उत्पन्न करेगा ...

इसके VIEWSउपयोग के लिए :

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'

पूरी तरह से काम किया। QA के लिए प्रयुक्त db से हटाने के लिए 61,037 खाली टेबल थे। मैंने कैस्केड बाधाओं का उदाहरण दिया। आउटपुट तैयार किया और फिर इसे एक स्क्रिप्ट में कॉपी किया और इसे चलाया। हमेशा के लिए ले लिया लेकिन यह एक आकर्षण की तरह काम किया! धन्यवाद!
तेहबेरेडेडोन

5

मैंने इस पोस्ट को तब देखा था जब मैं @Xenph यान पर आधारित सभी वर्डप्रेस टेबल को छोड़ने के लिए mysql स्टेटमेंट की तलाश कर रहा था।

SELECT CONCAT(  'DROP TABLE `', TABLE_NAME,  '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE  'wp_%'

यह आपको wp_ के साथ शुरू होने वाले सभी तालिकाओं के लिए ड्रॉप क्वेरी का सेट देगा


5

यहाँ मेरा समाधान है:

SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';

और निश्चित रूप से आपको TABLE_PREFIX_GOES_HEREअपने उपसर्ग के साथ बदलने की आवश्यकता है ।


5
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

संपादित करें:

sp_MSforeachtable अनिर्दिष्ट है इसलिए उत्पादन के लिए उपयुक्त नहीं है क्योंकि यह MS_SQL संस्करण के आधार पर व्यवहार भिन्न हो सकता है।


बहुत बढ़िया एक-लाइनर! यह शीर्ष पर मतदान किया जाना चाहिए।
user3413723

4
CREATE PROCEDURE usp_GenerateDROP
    @Pattern AS varchar(255)
    ,@PrintQuery AS bit
    ,@ExecQuery AS bit
AS
BEGIN
    DECLARE @sql AS varchar(max)

    SELECT @sql = COALESCE(@sql, '') + 'DROP TABLE [' + TABLE_NAME + ']' + CHAR(13) + CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE @Pattern

    IF @PrintQuery = 1 PRINT @sql
    IF @ExecQuery = 1 EXEC (@sql)
END

2

ज़ेनफ यान का जवाब मेरी तुलना में बहुत साफ था लेकिन यहाँ मेरा सब कुछ एक जैसा है।

DECLARE @startStr AS Varchar (20)
SET @startStr = 'tableName'

DECLARE @startStrLen AS int
SELECT @startStrLen = LEN(@startStr)

SELECT 'DROP TABLE ' + name FROM sysobjects
WHERE type = 'U' AND LEFT(name, @startStrLen) = @startStr

बस tableNameउन पात्रों को बदलें जिन्हें आप खोजना चाहते हैं।


1

इसने मेरे लिए काम किया।

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += '
DROP TABLE ' 
    + QUOTENAME(s.name)
    + '.' + QUOTENAME(t.name) + ';'
    FROM sys.tables AS t
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id] 
    WHERE t.name LIKE 'something%';

PRINT @sql;
-- EXEC sp_executesql @sql;

0
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

- टेस्ट तालिका का नाम है


यह वास्तव में कुछ भी निष्पादित नहीं करता है, बस आदेशों का एक गुच्छा लौटाता है।
चुपके रब्बी

0
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

0

मुझे Xenph Yan के उत्तर पर थोड़ा सा व्युत्पन्न करना था, मुझे संदेह है क्योंकि मेरे पास डिफ़ॉल्ट स्कीमा में टेबल नहीं थे।

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'

0

अस्थायी तालिकाओं के मामले में, आप प्रयास करना चाह सकते हैं

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.