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

मैं एक स्क्रिप्ट को उन सभी टेबलों को छोड़ना चाहता हूं जिनके नाम किसी दिए गए स्ट्रिंग से शुरू होते हैं। मुझे यकीन है कि यह कुछ गतिशील एसक्यूएल और INFORMATION_SCHEMA तालिकाओं के साथ किया जा सकता है।

अगर किसी के पास स्क्रिप्ट है, या जल्दी से एक को दस्तक दे सकता है, तो कृपया इसे पोस्ट करें।

अगर कोई इसे स्वयं समझने से पहले कोई जवाब नहीं देता है, तो मैं अपना समाधान पोस्ट करूंगा।

0
ro fr bn

14 उत्तर

Xenph Yan's answer was far cleaner than mine but here is mine all the same.

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 को बदलें जिन्हें आप खोजना चाहते हैं।

0
जोड़ा
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]%'
0
जोड़ा
आपके लक्ष्य उपसर्ग के साथ "उपसर्ग" को प्रतिस्थापित करते समय मैं ब्रैकेट को हटाने के लिए जोड़ सकता हूं।
जोड़ा लेखक Levitikon, स्रोत
बहुत बढ़िया! मैं वास्तव में स्क्रिप्ट के पहले दृष्टिकोण की सराहना करता हूं ताकि मैं देख सकूं कि निष्पादन के विरोध में क्या छोड़ने वाला था। सुपर सहायक धन्यवाद !!
जोड़ा लेखक hardba11, स्रोत
MYSQL: चयन करें ('ड्रॉप टेबल', TABLE_NAME, ";") INFORMATION_SCHEMA.TABLES से डेटा के रूप में जहां 'मुझे पसंद है' '[prefix]%' --- उन लोगों के लिए जो मुझे पसंद करते हैं
जोड़ा लेखक Andre, स्रोत
परिणाम में भी विचार शामिल हैं
जोड़ा लेखक Ondra, स्रोत
अगर आप अपने उपसर्ग का हिस्सा हैं, तो बचने के लिए मत भूलना, उदाहरण के लिए। जहां TABLE_NAME की तरह है \ _% 'ESCAPE' \ ';
जोड़ा लेखक EM0, स्रोत
यह एक स्क्रिप्ट उत्पन्न करता है, लेकिन स्क्रिप्ट निष्पादित कैसे करता है?
जोड़ा लेखक daOnlyBG, स्रोत

धन्यवाद कर्ट, यह वही समाधान है जो मैं अपने माध्यम से मिडवे था।

यद्यपि आपका मेरे मुकाबले अच्छा है - यह खुद को आसान संशोधन के लिए उधार देता है। मैंने चयन के लिए एक संघ जोड़ा और कुछ विचारों को भी मिटा दिया;)

declare @cmd varchar(4000)
declare cmds cursor for 
Select 'drop table [' + Table_Name + ']'
From    INFORMATION_SCHEMA.TABLES
Where   Table_Name like 'prefix%'
union
Select 'drop view [' + Table_Name + ']'
From    INFORMATION_SCHEMA.VIEWS
Where   Table_Name like 'prefix%'
open cmds
while 1=1
begin
    fetch cmds into @cmd
    if @@fetch_status != 0 break
    exec(@cmd)
end
close local
deallocate local

चिंता न करें, यह उत्पादन डेटाबेस नहीं है - यह केवल मेरे देव डीबी के आसान साफ-सफाई के लिए है, जबकि मैं सामान की कोशिश करता हूं।

0
जोड़ा
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
0
जोड़ा

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

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'
0
जोड़ा

मैंने इस पोस्ट को देखा जब मैं @Xenph यान के आधार पर सभी वर्डप्रेस टेबल ड्रॉप करने के लिए MySQL कथन की तलाश कर रहा था, जो मैंने अंततः किया था:

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

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

0
जोड़ा
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

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

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

0
जोड़ा
बहुत बढ़िया एक लाइनर! इसे शीर्ष पर वोट दिया जाना चाहिए।
जोड़ा लेखक user3413723, स्रोत

ओरेकल एक्सई पर यह काम करता है:

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%'

जो ड्रॉप टेबल कैस्केड बाधाओं का एक समूह उत्पन्न करेगा कथन ...

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

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
0
जोड़ा

यह आपको विदेशी कुंजी ऑर्डर में टेबल प्राप्त करेगा और 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
0
जोड़ा
त्वरित समाधान: WHNE क्लॉज में तालिका नाम कुछ बार प्रकट होता है और OBJECT_NAME (so.object_id) के साथ प्रतिस्थापित किया जाना चाहिए। अच्छी लिपि!
जोड़ा लेखक witttness, स्रोत
जोड़ा लेखक Tony O'Hagan, स्रोत

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

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

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

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

Edit Code sample fixed.

0
जोड़ा
मास्टर और विस्तार तालिकाओं के बीच विदेशी कुंजी बाधाओं के कारण आपको कई बार इस स्क्रिप्ट को चलाने की आवश्यकता हो सकती है।
जोड़ा लेखक Alexander Prokofyev, स्रोत
SQL सर्वर 2005 में मुझे पिछली दो पंक्तियों को करीबी cmds में बदलना पड़ा; cmds deallocate
जोड़ा लेखक Hamish Grubijan, स्रोत
चेतावनी : यह समाधान SQL सर्वर द्वारा बनाई गई तालिकाओं को भी हटा सकता है! मेरा समाधान नीचे से बचाता है और विदेशी कुंजी निर्भरता क्रम में तालिकाओं को हटा देता है।
जोड़ा लेखक Tony O'Hagan, स्रोत
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

- टेस्ट टेबल नाम है

0
जोड़ा
यह वास्तव में कुछ भी निष्पादित नहीं करता है, बस आदेशों का एक गुच्छा वापस करें।
जोड़ा लेखक Stealth Rabbi, स्रोत
एफके के बारे में क्या?
जोड़ा लेखक user3104183, स्रोत
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
जोड़ा

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

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

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

0
जोड़ा

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

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
0
जोड़ा