যাদের নাম একটি প্রদত্ত স্ট্রিং দিয়ে শুরু হয় আমি কীভাবে সমস্ত টেবিলগুলি ড্রপ করতে পারি?
আমি মনে করি এটি কিছু গতিশীল এসকিউএল এবং INFORMATION_SCHEMA
টেবিলগুলির সাহায্যে করা যেতে পারে ।
যাদের নাম একটি প্রদত্ত স্ট্রিং দিয়ে শুরু হয় আমি কীভাবে সমস্ত টেবিলগুলি ড্রপ করতে পারি?
আমি মনে করি এটি কিছু গতিশীল এসকিউএল এবং INFORMATION_SCHEMA
টেবিলগুলির সাহায্যে করা যেতে পারে ।
উত্তর:
যদি ডাটাবেসে একের বেশি থাকে তবে মালিককে অন্তর্ভুক্ত করতে আপনার ক্যোয়ারীটি সংশোধন করতে হবে।
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 তবে স্ক্রিপ্ট প্রজন্মের একটি সুবিধা হ'ল এটি আপনাকে চালানোর আগে কী চালানো হবে তার সম্পূর্ণতা পর্যালোচনা করার সুযোগ দেয়।
আমি জানি যে আমি যদি প্রোডাকশন ডাটাবেসের বিরুদ্ধে এটি করতে যাচ্ছিলাম তবে আমি যথাসম্ভব যত্নবান হব।
সম্পাদনা কোড নমুনা স্থির।
close cmds; deallocate cmds
।
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]%'
WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
এটি আপনাকে বিদেশী কী ক্রমে টেবিলগুলি পাবেন এবং এসকিউএল সার্ভারের তৈরি কয়েকটি টেবিল বাদ দেওয়া এড়াতে পারবেন। 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
ওরাকল এক্সিতে এটি কাজ করে:
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%'
আমি এই পোস্টটি দেখেছি যখন আমি @ জেনাফ ইয়ান ভিত্তিক সমস্ত ওয়ার্ডপ্রেস টেবিলগুলি ফেলে দেওয়ার জন্য মাইএসকিএল বিবৃতি খুঁজছিলাম তখন আমি যা করেছি তা অবশেষে:
SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'wp_%'
এটি আপনাকে সমস্ত টেবিলের জন্য ড্রপ ক্যোয়ারির সেটটি ডাব্লুপি_ দিয়ে শুরু করবে
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'
সম্পাদনা:
sp_MSforeachtable undocumented তাই উত্পাদনের জন্য উপযুক্ত নয় কারণ এটির আচরণের MS_SQL সংস্করণের উপর নির্ভর করে পরিবর্তিত হতে পারে।
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
জেনফ ইয়ান এর উত্তর আমার চেয়ে অনেক বেশি পরিষ্কার ছিল কিন্তু এখানে আমার সব একই আছে।
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
আপনি যে অক্ষরগুলির সাথে সন্ধান করতে চান কেবল তার মধ্যে পরিবর্তন করুন ।
এটি আমার পক্ষে কাজ করেছে।
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;
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'
- টেস্টের নাম টেবিলের নাম
অস্থায়ী সারণীর ক্ষেত্রে, আপনি চেষ্টা করতে পারেন
SELECT 'DROP TABLE "' + t.name + '"'
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'