কীভাবে একটি ক্যোয়ারিতে সাধারণ উপসর্গ সহ একাধিক টেবিলগুলি ড্রপ করবেন?


17

আমি মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৮ ব্যবহার করছি y আমার প্রশ্নটি: একটি ক্যোয়ারিতে সাধারণ উপসর্গের সাথে একাধিক টেবিল কীভাবে ফেলে দেওয়া যায়?

টেবিলের নামের মতো কিছু:

LG_001_01_STLINE, 
LG_001_02_STFICHE

উত্তর:


32

আপনি ক্যাটালগের ভিউগুলি ব্যবহার করে একটি স্ট্রিং তৈরি করতে পারেন, যেমন:

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

PRINT @sql;
-- EXEC sp_executesql @sql;

অবশ্যই সম্ভাব্য গোটাচগুলি রয়েছে, উদাহরণস্বরূপ যদি এই টেবিলগুলির বিদেশী কী সম্পর্ক থাকে তবে আপনাকে প্রথমে এগুলি ফেলে দিতে হবে, বা একটি নির্দিষ্ট ক্রমে টেবিলগুলি ফেলে দেওয়ার জন্য আউটপুটকে সাজিয়ে তুলতে হবে।

কেবল সারণির তালিকা পেতে, ব্যবহার করুন:

SELECT s.name, t.name 
  FROM sys.tables AS t 
  INNER JOIN sys.schemas AS s 
  ON t.[schema_id] = s.[schema_id] 
  WHERE t.name LIKE 'LG_001%';

"একটি নির্দিষ্ট ক্রমে টেবিলগুলি ফেলে দেওয়ার আউটপুটটি সাজান" সম্পর্কে মনে রাখার জন্য আপনাকে অনেক ধন্যবাদ!
sdlins

4

আমি এই কোয়েরিটি চালিয়েছি এবং ফলাফলগুলি সমস্ত টেবিলগুলি ফেলে দেওয়ার জন্য পুনরায় ক্যোয়ারী উইন্ডোতে পেস্ট করেছি:

SELECT 'DROP TABLE ' + NAME from sys.tables
ORDER BY NAME

আপনি যদি সমস্ত টেবিল মুছতে চান তবে এ, বি, সি বা ডি দিয়ে শুরু হওয়া নামগুলি রাখুন:

SELECT 'DROP TABLE ' + NAME from sys.tables
WHERE NAME NOT LIKE '[ABCD]%'
GROUP BY NAME

-1

এটি আপনাকে অনেক বেশি সংখ্যক সারণী মুছতে দেয়।

declare 
@cursor as cursor, 
@FTABLE as varchar(500) 
set @cursor = CURSOR FOR 
select 'drop table ' + NAME + ';' 
from sys.tables 
where not SUBSTRING(NAME,10,3) in 
( 
'310', 
'311', 
'312', 
'313', 
'314', 
'320', 
'321', 
'322' 
) 
open @cursor 
fetch next from @cursor into @FTABLE 
while (@@FETCH_STATUS =0) 
begin 
        exec(@FTABLE) 
        print @FTABLE 
fetch next from @cursor into @FTABLE 
end 
close @cursor 
deallocate @cursor 

2
এর চেয়ে বড় কি? আপনি কি আপনার এসকিউএলকে সংশোধন করতে পারবেন যাতে এটি ওপির মতো যেমন একটি সাধারণ উপসর্গ সহ সারণীগুলি সন্ধান করে?
dezso

-1

আমি এটি লিখেছি যা আমি লিখেছি:

  DECLARE @chv_LG001_TableName nvarchar (100)
  DECLARE @chv_DROP_LG001_Tables nvarchar(100)
  DECLARE @chv_LG001_Table_Count int

  SET @chv_LG001_Table_Count = (SELECT count(OBJECT_NAME(id))
        FROM SYSINDEXES
        WHERE OBJECTPROPERTY(id,'isUserTable')=1 AND indid < 2
            and OBJECT_NAME(id) like 'LG_001%')

 IF @chv_LG001_Table_Count > 0
    BEGIN

    DECLARE  Drop_LG001_Tables_Cursor CURSOR FOR
      -- This query will give you the table list you are wanting
        SELECT OBJECT_NAME(id)
        FROM SYSINDEXES
        WHERE OBJECTPROPERTY(id,'isUserTable')=1 AND indid < 2
            and OBJECT_NAME(id) like 'LG_001%'

    OPEN Drop_LG001_Tables_Cursor
    FETCH NEXT FROM Drop_LG001_Tables_Cursor INTO @chv_LG001_TableName 
    WHILE @@FETCH_STATUS = 0 

    BEGIN           

    SET @chv_DROP_LG001_Tables = 'DROP TABLE ' + '[' + @chv_LG001_TableName + ']'

    --Print @chv_DROP_LG001_Tables 
-- Uncomment the next line when you are ready because it WILL clear out these tables. 
    --EXEC sp_executesql @chv_DROP_LG001_Tables

    FETCH NEXT FROM Drop_LG001_Tables_Cursor
    INTO @chv_LG001_TableName

    END

    CLOSE Drop_LG001_Tables_Cursor
    DEALLOCATE Drop_LG001_Tables_Cursor

END

2
এখানে অনেক বিষয়। (1) কার্সার স্ক্যাফোর্ডিং জটিল এবং অপ্রয়োজনীয়। (২) আপনি যখন ফায়ারহোজ কার্সার ব্যবহার করেন তখন আপনার কমপক্ষে STATICএবং / অথবা LOCAL FAST_FORWARD] ব্যবহার করা উচিত ( sqlperformance.com/2012/09/t-sql-queries/cursor-options )। (3) আপনার অবচয়, পিছনে সামঞ্জস্যতা মত ব্যবহার করা উচিত নয় sysindexes। (৪) আপনার স্ক্রিপ্ট ধরে নেয় যে সমস্ত টেবিলগুলি dboস্কিমাতে রয়েছে (বা আরও খারাপ, নির্বাহক ব্যবহারকারীর ডিফল্ট স্কিমা, যা নাও হতে পারে dbo)।
অ্যারন বারট্র্যান্ড

-2

এটি executeনিম্নলিখিত হিসাবে ব্যবহার করে করা যেতে পারে :

declare @sql1 nvarchar(max) 
SELECT @sql1 =
 STUFF(
  (
    select ' drop table dbo.[' + name + ']'

FROM         sys.sysobjects AS sobjects
WHERE     (xtype = 'U') AND (name LIKE 'GROUP_BASE_NEW_WORK_%')
        for xml path('')
   ),
        1,1,'')

        execute sp_executesql @sql1

1
এটি মূলত একটি ভিন্নতা, তবে গ্রহণযোগ্য উত্তরে কোনও উন্নতি ছাড়াই। পার্থক্যটি কেবলমাত্র আপনি ধরে নিতে বেছে নিয়েছেন যে 1) ডিফল্ট স্কিমা হওয়ার কথা dbo, এবং 2) নামগুলি কখনই একটি ধারণ করতে পারে না ]- এটি উভয়ই ওপির ক্ষেত্রে সত্য হতে পারে তবে এটি এখনও ভাল হবে এই অনুমানগুলি উল্লেখ করার ধারণা, কারণ তাদের থেকে অনুসরণ করা সতর্কতাগুলি অন্য লোকেদের কাছে পুরোপুরি সুস্পষ্ট নাও হতে পারে। তবুও, যেমন আমি শুরুতে বলেছিলাম, এই উত্তরটির সাথে আমার মূল সমস্যাটি হ'ল এটি কোনও নতুন মান যুক্ত না করে কেবল ইতিমধ্যে বিদ্যমান পরামর্শটি পুনরায় সেট করে।
অ্যান্ড্রি এম

-3
SELECT s.name, t.name 
  FROM sys.tables AS t 
  INNER JOIN sys.schemas AS s 
  ON t.[schema_id] = s.[schema_id] 
  WHERE t.name LIKE 'LG_001%';

ক্যোয়ারির উপরে চলে যান এবং ফলাফলগুলিকে একটি সিএসভিতে সংরক্ষণ করুন। তারপরে সেই সিএসভি একটি নোটপ্যাডে খুলুন। তারপরে ড্রপ টেবিল স্কেমার সাথে স্কিমাটি প্রতিস্থাপন করতে সিটিটিএল + এইচ করুন যা আপনাকে সমস্ত ড্রপ ক্যোয়ারী দেবে, এই স্ক্যুয়াল সরঞ্জামটিতে এই বড় স্ক্যুয়ালটি অনুলিপি করে পেস্ট করবে এবং কার্যকর করবে

যদি আপনার ফলাফল হয়

myschema.table1
myschema.table2

প্রতিস্থাপনের পরে, এটি দেখতে এটির মতো লাগবে

DROP TABLE MYSCHEMA.TABLE1
DROP TABLE MYSCHEMA.TABLE2

-1 আপনি কেন এক্সেলের অনুলিপি / পেস্ট করবেন এবং ড্রপ আদেশগুলি উত্পন্ন করবেন? আপনি সহজেই PRINTস্টেটমেন্ট ব্যবহার করে এটি করতে পারেন । আপনার উত্তরটি সর্বোচ্চ ভোট প্রাপ্ত উত্তরের চেয়ে কীভাবে ভাল?
কিন শাহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.