যাদের নামগুলি একটি নির্দিষ্ট স্ট্রিং দিয়ে শুরু হয় সেগুলি সমস্ত টেবিলটি ফেলে দিন


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

এটি জেনারেট স্ক্রিপ্ট প্লাস রানের দ্বি-পদক্ষেপের পদ্ধতির চেয়ে পরিষ্কার clean তবে স্ক্রিপ্ট প্রজন্মের একটি সুবিধা হ'ল এটি আপনাকে চালানোর আগে কী চালানো হবে তার সম্পূর্ণতা পর্যালোচনা করার সুযোগ দেয়।

আমি জানি যে আমি যদি প্রোডাকশন ডাটাবেসের বিরুদ্ধে এটি করতে যাচ্ছিলাম তবে আমি যথাসম্ভব যত্নবান হব।

সম্পাদনা কোড নমুনা স্থির।


5
মাস্টার এবং বিশদ টেবিলের মধ্যে বিদেশী কী বাধার কারণে আপনাকে এই স্ক্রিপ্টটি বেশ কয়েকবার চালাতে হতে পারে।
আলেকজান্ডার প্রোকোফিয়েভ

7
এসকিউএল সার্ভার ২০০৫-এ আমাকে শেষ দুটি লাইন পরিবর্তন করতে হয়েছিল close cmds; deallocate cmds
হামিশ গ্রুবিজন

সতর্কতা : এই সমাধানটি এসকিউএল সার্ভারের তৈরি টেবিলগুলিও মুছতে পারে! আমার নীচের সমাধানটি এড়িয়ে চলে এবং বিদেশী কী নির্ভরতা ক্রমের সারণীগুলি মুছে দেয়।
টনি ও'হাগান

এটি আমার পক্ষে কার্যকর হয়নি। এই প্রশ্নের উত্তর কাজ করেছে: 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
এমওয়াইএসকিউএল: ট্যাবলেটকে যেখানে পছন্দ করা হয়েছে তার [উপসর্গ]% '--- তথ্য যাঁরা আমার মতো এই থ্রেডটি খুঁজে পেয়েছেন তাদের জন্য - "ইনড্রোমেশন এসএইচএইএমএ। টেবিলগুলি যেখানে' থ্রেড কনট্যাক্ট ('ড্রপ ট্যাবলেট', ট্যাবলেট,"; ") বেছে নিন
আন্ড্রে


1
পালাতে ভুলবেন না _ যদি এটি আপনার উপসর্গের অংশ হয়, যেমন। WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0

3
এটি একটি স্ক্রিপ্ট জেনারেট করে, তবে কীভাবে কেউ স্ক্রিপ্টটি কার্যকর করে?
daOnlyBG

16

এটি আপনাকে বিদেশী কী ক্রমে টেবিলগুলি পাবেন এবং এসকিউএল সার্ভারের তৈরি কয়েকটি টেবিল বাদ দেওয়া এড়াতে পারবেন। 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


3
দ্রুত ফিক্স: টেবিলনাম WHERE ধারাগুলিতে কয়েকবার উপস্থিত হয় এবং ওবিজেইসিআইএআইএআই (so.object_id) দিয়ে প্রতিস্থাপন করা উচিত। দুর্দান্ত স্ক্রিপ্ট!
ওয়াটনেস

6

ওরাকল এক্সিতে এটি কাজ করে:

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

নিখুঁতভাবে কাজ করেছেন। কিউএর জন্য ব্যবহৃত একটি ডিবি থেকে মুছতে 61,037 টি খালি টেবিল ছিল। আমি ক্যাসকেড সীমাবদ্ধতার উদাহরণ ব্যবহার করেছি। আউটপুট উত্পন্ন করে তারপরে এগুলি সমস্ত স্ক্রিপ্টে অনুলিপি করে চালিত করে। চিরকালের জন্য নিল তবে এটি কবজির মতো কাজ করেছিল! ধন্যবাদ!
tehbeardedone

5

আমি এই পোস্টটি দেখেছি যখন আমি @ জেনাফ ইয়ান ভিত্তিক সমস্ত ওয়ার্ডপ্রেস টেবিলগুলি ফেলে দেওয়ার জন্য মাইএসকিএল বিবৃতি খুঁজছিলাম তখন আমি যা করেছি তা অবশেষে:

SELECT CONCAT(  'DROP TABLE `', TABLE_NAME,  '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE  '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 undocumented তাই উত্পাদনের জন্য উপযুক্ত নয় কারণ এটির আচরণের MS_SQL সংস্করণের উপর নির্ভর করে পরিবর্তিত হতে পারে।


অসাধারণ ওয়ান-লাইনার! এটি শীর্ষে ভোট দেওয়া উচিত।
ব্যবহারকারী 3413723

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

আমার সন্দেহ হওয়া জেন্ফ ইয়ান এর উত্তরে আমাকে কিছুটা ব্যয় করতে হয়েছিল কারণ আমার কাছে টেবিলগুলি ডিফল্ট স্কিমাতে ছিল না।

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]%'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.