আপনি কীভাবে টিএসকিউএল ব্যবহার করে একটি ডেটাবেজে সমস্ত টেবিল ছাঁটাই করবেন?


204

আমার কাছে একটি ডাটাবেসের জন্য একটি পরীক্ষার পরিবেশ রয়েছে যা আমি পরীক্ষার চক্রের শুরুতে নতুন ডেটা দিয়ে পুনরায় লোড করতে চাই। আমি পুরো ডাটাবেসটি পুনর্নির্মাণে আগ্রহী নই - কেবলমাত্র ডেটা "পুনরায় সেট করা"।

টিএসকিউএল ব্যবহার করে সমস্ত টেবিল থেকে সমস্ত ডেটা সরানোর সর্বোত্তম উপায় কী? সিস্টেম স্টোরেজ পদ্ধতি, ভিউ, ইত্যাদি ব্যবহার করা যেতে পারে? আমি প্রতিটি টেবিলের জন্য ম্যানুয়ালি কাটা টেবিলের বিবৃতি তৈরি করতে এবং বজায় রাখতে চাই না- আমি এটিকে গতিশীল হতে পছন্দ করব।

উত্তর:


188

এসকিউএল 2005 এর জন্য,

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'

2000 এবং 2005/2008 এর জন্য আরও কয়েকটি লিঙ্ক ..


62
বিদেশী কী রয়েছে এমন টেবিলগুলি আপনি কাটাতে পারবেন না, সুতরাং টেবিলগুলির মধ্যে কোনও বিদেশী কী বাধা নেই (বা সেগুলি অক্ষম করা হয়েছে) কেবল তখনই এটি কাজ করবে।
মার্জজ

1
আমি রাজি হয়েছি ... যেহেতু তিনি বিশেষত টেবিলগুলি কাটানোর জন্য বলেছেন, তিনি ইতিমধ্যে বিদেশী চাবি দিয়ে সমস্যার সমাধান করেছেন ..
গুলজার নাজিম

@ গুলজার-বাছাই করুন- কীভাবে এফকে পরিচালনা করতে হবে সে সম্পর্কে আমি একটি পৃথক প্রশ্ন পোস্ট করেছি তবে আপনার উত্তরটি তার নিজস্ব যোগ্যতার উপর দাঁড়িয়ে আছে।
রায়

11
@ সাম: না, তা হবে না! সারণীতে থাকা ডেটা অপ্রাসঙ্গিক। যতক্ষণ না কোনও টেবিলের রেফারেন্স করার জন্য কোনও বিদেশী কী বাধা রয়েছে (এমনকি কোনও অক্ষম এমনকি) আপনি এটি কেটে ফেলতে পারবেন না।
TToni

3
'এক্সইসি এসপি_এমএসএফটাইবল' ড্রপ টেবিল? ' দুর্দান্ত কাজও করছেন :) (ডাটাবেস থেকে সমস্ত টেবিল
আনন্দিত

418

বিদেশী কী সম্পর্ক রয়েছে এমন টেবিলগুলি থেকে ডেটা মুছে ফেলার ক্ষেত্রে - যা মূলত কোনও সঠিকভাবে ডিজাইন করা ডাটাবেসের ক্ষেত্রেই হয় - আমরা সমস্ত প্রতিবন্ধকতাগুলি অক্ষম করতে পারি, সমস্ত ডেটা মুছতে পারি এবং তারপরে সীমাবদ্ধতাগুলি পুনরায় সক্ষম করতে পারি can

-- disable all constraints
EXEC sp_MSForEachTable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- delete data in all tables
EXEC sp_MSForEachTable "DELETE FROM ?"

-- enable all constraints
exec sp_MSForEachTable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

আরো সীমাবদ্ধতা এবং ট্রিগার নিষ্ক্রিয় করার এখানে

যদি কিছু টেবিলের পরিচয় কলাম থাকে তবে আমরা সেগুলি পুনরায় পুনঃসারণ করতে চাই

EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"

নোট করুন যে RESEED এর আচরণটি ব্র্যান্ডের নতুন টেবিলের মধ্যে পার্থক্য করে এবং বিওএল থেকে এর আগে কিছু ডেটা betweenোকানো ছিল এমন একটি :

ডিবিসিসি চেকিডেন্ট ('টেবিলের নাম', রিসিড, নতুন রিসাইডভ্যালু)

বর্তমান পরিচয় মানটি নতুনআরসিডভ্যালুতে সেট করা আছে। এটি তৈরির পর থেকে যদি কোনও সারি সারণীতে সন্নিবেশ না করা থাকে, তবে ডিবিসিসি চেকআইডিএনটি কার্যকর করার পরে সন্নিবেশ করা প্রথম সারিটি নতুন রসিডভ্যালু পরিচয় হিসাবে ব্যবহার করবে। অন্যথায়, theোকানো পরবর্তী সারিতে newReseedValue + 1 ব্যবহার করা হবে যদি নতুন রসিডভ্যালুটির মান সনাক্তকরণ কলামের সর্বাধিক মানের চেয়ে কম হয়, তবে পরবর্তী টেবিলে উল্লেখগুলিতে ত্রুটি বার্তা 2627 উত্পন্ন হবে।

প্রতিবন্ধকতা নিষ্ক্রিয় করে কাটা কাটা ব্যবহার করতে দেয় না এই বিষয়টি নির্দেশ করার জন্য রবার্টকে ধন্যবাদ , প্রতিবন্ধকতাগুলি বাদ দিতে হবে এবং তারপরে পুনরায় তৈরি করতে হবে


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

1
এই বিবৃতিতে কেবল একটি টাইপো "টেবিল" কীওয়ার্ডটি থাকা উচিত নয় EXEC sp_MSforEachTable "টেবিল থেকে মুছুন?" । সঠিক সংস্করণটি হওয়া উচিত: EXEC sp_MSforEachTable "FROM থেকে মুছবেন?"
রাঘব

4
যদি আপনি ২০০৮ বা নতুন এসএসএমএস ব্যবহার করে থাকেন তবে সম্ভবত আপনি SET ROWCOUNT 0আপনার স্ক্রিপ্টের শুরুতে যুক্ত করতে চাইবেন যেহেতু ডিফল্টটি ক্রিয়াকে 500 সারিতে সীমাবদ্ধ করে দেয়! আমার মতো হতাশাগুলি ত্রুটি পাবেন কারণ সমস্ত ডেটা আসলে মুছে ফেলা হবে না।
শান হ্যানলি

1
এটি দুর্দান্ত কাজ করেছে। আমার ক্ষেত্রে আমাকে এক্সইটিসি sp_msforeachtable "ALTER TABLE? TRIGR All Disable" এবং EXEC sp_msforeachtable "ALTER TABLE? TRIGG All all" মুছে ফেলার বিবরণীর আগে এবং পরে যোগ করতে হয়েছিল?
রবসি

2
আমার প্রিয় উত্তর। তবে কেন আপনি (সমস্ত, এমনকি মন্তব্যকারী) ডাবল-কোটগুলিতে আক্ষরিক এসকিউএল স্ট্রিংগুলি আবদ্ধ করেন?
বিটুলিয়ান

57

এখানে ডেটাবেস মোছার স্ক্রিপ্টগুলির রাজা বাবা। এটি সমস্ত সারণী সাফ করবে এবং এগুলি সঠিকভাবে পুনরায় পরীক্ষা করবে:

SET QUOTED_IDENTIFIER ON;
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? NOCHECK CONSTRAINT ALL'  
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? DISABLE TRIGGER ALL'  
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; DELETE FROM ?'  
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? CHECK CONSTRAINT ALL'  
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? ENABLE TRIGGER ALL' 
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON';

IF NOT EXISTS (
    SELECT
        *
    FROM
        SYS.IDENTITY_COLUMNS
        JOIN SYS.TABLES ON SYS.IDENTITY_COLUMNS.Object_ID = SYS.TABLES.Object_ID
    WHERE
        SYS.TABLES.Object_ID = OBJECT_ID('?') AND SYS.IDENTITY_COLUMNS.Last_Value IS NULL
)
AND OBJECTPROPERTY( OBJECT_ID('?'), 'TableHasIdentity' ) = 1

    DBCC CHECKIDENT ('?', RESEED, 0) WITH NO_INFOMSGS;

উপভোগ করুন, তবে সাবধান!


2
দুর্ভাগ্যক্রমে উপরের কমান্ডটি ব্যর্থ হয়েছে যদি আপনার কাছে গণনাকৃত কলাম রয়েছে, যেহেতু স্প_এমএসফ্রোচ্যাটেবলের স্পষ্টতই SET QUOTED_IDENTITY OFFএর শরীরে রয়েছে ( লিঙ্ক )। আপডেট: ফিক্সটি "এসইটি কোয়েট এআইডিএনডিআইএফআইআর চালু করা হবে;" এই ত্রুটি
উত্থাপনকারী

1
দেখে মনে হচ্ছে এটি আমার পরিচয়গুলি পুনরায় পাঠায় নি
টোটুও

48

এটি করার সহজ উপায় হল

  1. এসকিউএল ম্যানেজমেন্ট স্টুডিও খুলুন
  2. আপনার ডাটাবেসে নেভিগেট করুন
  3. ডান ক্লিক করুন এবং নির্বাচনগুলি নির্বাচন করুন -> স্ক্রিপ্টগুলি তৈরি করুন (পিক 1)
  4. "অবজেক্টস নির্বাচন করুন" স্ক্রিনে, "নির্দিষ্ট বিষয় নির্বাচন করুন" বিকল্পটি নির্বাচন করুন এবং "টেবিলগুলি" পরীক্ষা করুন (ছবি 2)
  5. পরবর্তী স্ক্রিনে, "উন্নত" নির্বাচন করুন এবং তারপরে "স্ক্রিপ্ট ড্রপ এবং তৈরি করুন" বিকল্পটি "স্ক্রিপ্ট ড্রপ এবং তৈরি করুন" (চিত্র 3) এ পরিবর্তন করুন
  6. একটি নতুন সম্পাদক উইন্ডো বা একটি ফাইলে স্ক্রিপ্ট সংরক্ষণ করতে চয়ন করুন এবং প্রয়োজনীয় হিসাবে চালান।

এটি আপনাকে এমন একটি স্ক্রিপ্ট দেবে যা ডিবাগিংয়ের বিষয়ে উদ্বিগ্ন হওয়া বা আপনি সমস্ত কিছু অন্তর্ভুক্ত করে কিনা তা ছাড়াই আপনার সমস্ত টেবিলগুলি ড্রপ এবং পুনরায় তৈরি করে। যদিও এটি কেবল একটি ছাঁটাইয়ের চেয়ে আরও বেশি সম্পাদন করে, ফলাফলগুলি একই। কেবল মনে রাখবেন যে আপনার অটো-ইনক্রিমেন্টিং প্রাথমিক কীগুলি 0 থেকে শুরু হবে, কাটা টেবিলগুলির বিপরীতে যা নির্ধারিত শেষের মানটি মনে রাখবে। আপনার প্রিপ্রড বা উত্পাদন পরিবেশে যদি ম্যানেজমেন্ট স্টুডিওতে অ্যাক্সেস না থাকে তবে আপনি কোড থেকে এটিকেও কার্যকর করতে পারেন।

1।

এখানে চিত্র বর্ণনা লিখুন

2।

এখানে চিত্র বর্ণনা লিখুন

3।

এখানে চিত্র বর্ণনা লিখুন


1
সতর্কতা যদি আপনি এটি একটি খুব জটিল স্কিমা সহ একটি ডাটাবেসের জন্য ব্যবহার করেন। আমি এটি আমাদের প্রোডাকশন ডিবি-র একটি অনুলিপিতে চেষ্টা করেছি এবং এটি স্কিমাকে ট্র্যাশ করেছে, মোট পুনর্নির্মাণের প্রয়োজন।
টেকরকেট 9

1
আপনি সংরক্ষণ করতে চান এমন সমস্ত জিনিস আপনি স্ক্রিপ্টে পেয়েছেন
ক্যাপ্টেন কেনপাচি

12

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

এর বিকল্পটি হ'ল বিদেশী কীগুলি সহ টেবিলগুলি নির্ধারণ করা এবং এগুলি থেকে প্রথমে মুছুন, তারপরে আপনি বিদেশী কী ছাড়াই টেবিলগুলি কেটে ফেলতে পারবেন।

আরও বিশদ জানতে http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 এবং http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 দেখুন ।


1
ভাল যুক্তি. ভেবে দেখিনি। আমি প্রথমে সমস্ত সীমাবদ্ধতাগুলি অক্ষম করতে সক্ষম হতে পারি এবং তারপরে ডেটা অপসারণের পরে সেগুলি আবার সক্ষম করে তুলতে পারি।
রায়

7

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


দুর্ভাগ্যক্রমে আপনি প্রতিবার আপনার সমস্ত ফুলটেক্স সূচীগুলি হারাবেন
ক্রিস কেএল

6

এই না! সত্যিই, একটি ভাল ধারণা না।

আপনি যদি জানেন যে কোন টেবিলগুলি আপনি কাটাতে চান, একটি সঞ্চিত প্রক্রিয়া তৈরি করুন যা সেগুলি কাটাবে। বিদেশী কী সমস্যাগুলি এড়াতে আপনি অর্ডারটি ঠিক করতে পারেন।

আপনি যদি সত্যিই সেগুলি সমস্ত ছাঁটাই করতে চান (সুতরাং আপনি বিসিপি উদাহরণস্বরূপ এটি লোড করতে পারেন) আপনি ডাটাবেসটি ফেলে দিয়ে স্ক্র্যাচ থেকে একটি নতুন তৈরি করতে ঠিক তত দ্রুত হবেন, যার অতিরিক্ত সুবিধা হ'ল আপনি জানেন যে আপনি ঠিক কোথায় আছেন।


ভাল বিকল্প বিকল্প এখানে।
স্যাম

3
আপনার পদ্ধতির সমস্যাটি হ'ল টেবিল এবং ডাটাবেস বাদ দেওয়ার ফলে বিভিন্ন লগিন এবং স্কিমাতে দেওয়া সমস্ত অনুমতিগুলি হারাতে পারে। এটি পুনরায় তৈরি করতে প্রচুর টেবিল সহ বড় ডাটাবেসের জন্য বেদনাদায়ক হতে চলেছে।
পুনিত ভোরা

4

আপনি যদি একই ডিবিতে অন্য টেবিলগুলিতে ডেটা মুছতে / কাটানোর সময় কোনও নির্দিষ্ট টেবিলের (যেমন একটি স্ট্যাটিক লুক টেবিল) ডেটা রাখতে চান, তবে এতে ব্যতিক্রমগুলি সহ আপনার একটি লুপ দরকার। আমি এই প্রশ্নের জন্য যখন হোঁচট খেয়েছিলাম তখন এটিই আমি খুঁজছিলাম।

sp_MSForEachTable আমার কাছে বগী বলে মনে হচ্ছে (অর্থাত্ IF বিবৃতিগুলির সাথে অসঙ্গতিপূর্ণ আচরণ) যার কারণ সম্ভবত এটির এমএস দ্বারা স্বতঃসংশ্লিষ্ট।

declare @LastObjectID int = 0
declare @TableName nvarchar(100) = ''
set @LastObjectID = (select top 1 [object_id] from sys.tables where [object_id] > @LastObjectID order by [object_id])
while(@LastObjectID is not null)
begin
    set @TableName = (select top 1 [name] from sys.tables where [object_id] = @LastObjectID)

    if(@TableName not in ('Profiles', 'ClientDetails', 'Addresses', 'AgentDetails', 'ChainCodes', 'VendorDetails'))
    begin
        exec('truncate table [' + @TableName + ']')
    end 

    set @LastObjectID = (select top 1 [object_id] from sys.tables where [object_id] > @LastObjectID order by [object_id])
end

4

সমস্ত সারণী ছাঁটাইয়ের সবচেয়ে শক্ত অংশটি হ'ল বিদেশী কী সীমাবদ্ধতাগুলি সরিয়ে এবং পুনরায় বিজ্ঞাপন দেওয়া ing

নিম্নলিখিত কোয়েরিটি @myTempTable- এ প্রতিটি সারণির নামের সাথে সম্পর্কিত প্রতিটি সীমাবদ্ধতার জন্য ড্রপ তৈরি করে বিবৃতি তৈরি করে। আপনি যদি সমস্ত টেবিলের জন্য এগুলি উত্পন্ন করতে চান তবে আপনি সহজেই পরিবর্তে এই টেবিলের নামগুলি সংগ্রহ করতে তথ্য স্কিমা ব্যবহার করতে পারেন।

DECLARE @myTempTable TABLE (tableName varchar(200))
INSERT INTO @myTempTable(tableName) VALUES
('TABLE_ONE'),
('TABLE_TWO'),
('TABLE_THREE')


-- DROP FK Contraints
SELECT 'alter table '+quotename(schema_name(ob.schema_id))+
  '.'+quotename(object_name(ob.object_id))+ ' drop constraint ' + quotename(fk.name) 
  FROM sys.objects ob INNER JOIN sys.foreign_keys fk ON fk.parent_object_id = ob.object_id
  WHERE fk.referenced_object_id IN 
      (
         SELECT so.object_id 
         FROM sys.objects so JOIN sys.schemas sc
         ON so.schema_id = sc.schema_id
         WHERE so.name IN (SELECT * FROM @myTempTable)  AND sc.name=N'dbo'  AND type in (N'U'))


 -- CREATE FK Contraints
 SELECT 'ALTER TABLE [PIMSUser].[dbo].[' +cast(c.name as varchar(255)) + '] WITH NOCHECK ADD CONSTRAINT ['+ cast(f.name as varchar(255)) +'] FOREIGN KEY (['+ cast(fc.name as varchar(255)) +'])
      REFERENCES [PIMSUser].[dbo].['+ cast(p.name as varchar(255)) +'] (['+cast(rc.name as varchar(255))+'])'
FROM  sysobjects f
      INNER JOIN sys.sysobjects c ON f.parent_obj = c.id
      INNER JOIN sys.sysreferences r ON f.id = r.constid
      INNER JOIN sys.sysobjects p ON r.rkeyid = p.id
      INNER JOIN sys.syscolumns rc ON r.rkeyid = rc.id and r.rkey1 = rc.colid
      INNER JOIN sys.syscolumns fc ON r.fkeyid = fc.id and r.fkey1 = fc.colid
WHERE 
      f.type = 'F'
      AND
      cast(p.name as varchar(255)) IN (SELECT * FROM @myTempTable)

আমি তখনই চালানোর জন্য বিবৃতিগুলি অনুলিপি করেছি - তবে কিছুটা চেষ্টা করে আপনি এগুলিকে গতিশীলভাবে চালাতে একটি কার্সার ব্যবহার করতে পারেন।


3

আপনার ডাটাবেস স্ক্রিপ্ট আউট করা অনেক সহজ (এবং সম্ভবত আরও দ্রুত) তবে কেবল স্ক্রিপ্ট থেকে এটিকে ড্রপ করে তৈরি করুন।


3

একটি খালি "টেম্পলেট" ডাটাবেস তৈরি করুন, একটি সম্পূর্ণ ব্যাকআপ নিন। যখন আপনাকে রিফ্রেশ করতে হবে, কেবলমাত্র প্রতিস্থাপন ব্যবহার করে পুনরুদ্ধার করুন। দ্রুত, সহজ, বুলেটপ্রুফ। এবং যদি এখানে কয়েকটি টেবিলের প্রয়োজন হয় বা কিছু বেস ডেটা প্রয়োজন (যেমন কনফিগারেশন তথ্য, বা কেবলমাত্র প্রাথমিক তথ্য যা আপনার অ্যাপ্লিকেশনটি চালিত করে) এটিও পরিচালনা করে।


2

এটি করার একটি উপায় এটি ... সম্ভবত আরও 10 জন রয়েছে যা আরও ভাল / আরও দক্ষ, তবে মনে হয় এটি খুব কম সময়েই করা হয়ে গেছে, তাই এখানে যায় ...

এর tablesথেকে একটি তালিকা পান sysobjects, তারপরে কার্সারযুক্ত লোকদের জন্য লুপ করুন, sp_execsql('truncate table ' + @table_name)প্রত্যেককে কল করে iteration


বর্গক্ষেত্রের সাথে যোগ করা পোস্ট যা কেবল এটি করে :) যেহেতু এটিই আমি খুঁজছিলাম।
ক্রিস স্মিথ

1

কমেন্ট করা আউট বিভাগটি একবার চালান, আপনি যে টেবিলগুলি কেটে যেতে চান তা দিয়ে _TruncateList টেবিলটি বিশিষ্ট করুন, তারপরে বাকী স্ক্রিপ্টটি চালান। আপনি যদি খুব বেশি কিছু করেন তবে _স্ক্রিপ্টলগ টেবিলটি সময়ের সাথে সাথে পরিষ্কার করা দরকার।

আপনি যদি সমস্ত টেবিলগুলি করতে চান তবে সিস.সটেলগুলি থেকে # টি ট্রান্সকেটলিস্টে সুনির্দিষ্ট নাম লিখলে আপনি এটি পরিবর্তন করতে পারেন। তবে, আপনি সাধারণত সেগুলি করতে চান না।

এছাড়াও, এটি ডাটাবেসের সমস্ত বিদেশী কীগুলিকে প্রভাবিত করবে এবং এটি যদি আপনার অ্যাপ্লিকেশনটির জন্য খুব কট্টর-জোর হয় তবে আপনি তাও পরিবর্তন করতে পারেন। এটা আমার উদ্দেশ্য জন্য নয়।

/*
CREATE TABLE _ScriptLog 
(
    ID Int NOT NULL Identity(1,1)
    , DateAdded DateTime2 NOT NULL DEFAULT GetDate()
    , Script NVarChar(4000) NOT NULL
)

CREATE UNIQUE CLUSTERED INDEX IX_ScriptLog_DateAdded_ID_U_C ON _ScriptLog
(
    DateAdded
    , ID
)

CREATE TABLE _TruncateList
(
    TableName SysName PRIMARY KEY
)
*/
IF OBJECT_ID('TempDB..#DropFK') IS NOT NULL BEGIN
    DROP TABLE #DropFK
END

IF OBJECT_ID('TempDB..#TruncateList') IS NOT NULL BEGIN
    DROP TABLE #TruncateList
END

IF OBJECT_ID('TempDB..#CreateFK') IS NOT NULL BEGIN
    DROP TABLE #CreateFK
END

SELECT Scripts = 'ALTER TABLE ' + '[' + OBJECT_NAME(f.parent_object_id)+ ']'+
' DROP  CONSTRAINT ' + '[' + f.name  + ']'
INTO #DropFK
FROM .sys.foreign_keys AS f
INNER JOIN .sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id

SELECT TableName
INTO #TruncateList
FROM _TruncateList

SELECT Scripts = 'ALTER TABLE ' + const.parent_obj + '
    ADD CONSTRAINT ' + const.const_name + ' FOREIGN KEY (
            ' + const.parent_col_csv + '
            ) REFERENCES ' + const.ref_obj + '(' + const.ref_col_csv + ')
'
INTO #CreateFK
FROM (
    SELECT QUOTENAME(fk.NAME) AS [const_name]
        ,QUOTENAME(schParent.NAME) + '.' + QUOTENAME(OBJECT_name(fkc.parent_object_id)) AS [parent_obj]
        ,STUFF((
                SELECT ',' + QUOTENAME(COL_NAME(fcP.parent_object_id, fcp.parent_column_id))
                FROM sys.foreign_key_columns AS fcP
                WHERE fcp.constraint_object_id = fk.object_id
                FOR XML path('')
                ), 1, 1, '') AS [parent_col_csv]
        ,QUOTENAME(schRef.NAME) + '.' + QUOTENAME(OBJECT_NAME(fkc.referenced_object_id)) AS [ref_obj]
        ,STUFF((
                SELECT ',' + QUOTENAME(COL_NAME(fcR.referenced_object_id, fcR.referenced_column_id))
                FROM sys.foreign_key_columns AS fcR
                WHERE fcR.constraint_object_id = fk.object_id
                FOR XML path('')
                ), 1, 1, '') AS [ref_col_csv]
    FROM sys.foreign_key_columns AS fkc
    INNER JOIN sys.foreign_keys AS fk ON fk.object_id = fkc.constraint_object_id
    INNER JOIN sys.objects AS oParent ON oParent.object_id = fkc.parent_object_id
    INNER JOIN sys.schemas AS schParent ON schParent.schema_id = oParent.schema_id
    INNER JOIN sys.objects AS oRef ON oRef.object_id = fkc.referenced_object_id
    INNER JOIN sys.schemas AS schRef ON schRef.schema_id = oRef.schema_id
    GROUP BY fkc.parent_object_id
        ,fkc.referenced_object_id
        ,fk.NAME
        ,fk.object_id
        ,schParent.NAME
        ,schRef.NAME
    ) AS const
ORDER BY const.const_name

INSERT INTO _ScriptLog (Script)
SELECT Scripts
FROM #CreateFK

DECLARE @Cmd NVarChar(4000)
    , @TableName SysName

WHILE 0 < (SELECT Count(1) FROM #DropFK) BEGIN
    SELECT TOP 1 @Cmd = Scripts 
    FROM #DropFK

    EXEC (@Cmd)

    DELETE #DropFK WHERE Scripts = @Cmd
END

WHILE 0 < (SELECT Count(1) FROM #TruncateList) BEGIN
    SELECT TOP 1 @Cmd = N'TRUNCATE TABLE ' +  TableName
        , @TableName = TableName
    FROM #TruncateList

    EXEC (@Cmd)

    DELETE #TruncateList WHERE TableName = @TableName
END

WHILE 0 < (SELECT Count(1) FROM #CreateFK) BEGIN
    SELECT TOP 1 @Cmd = Scripts 
    FROM #CreateFK

    EXEC (@Cmd)

    DELETE #CreateFK WHERE Scripts = @Cmd
END

0

আমি দেখতে পাচ্ছি না যে ক্লিয়ারিং ডেটা প্রতিটি টেবিল ড্রপ এবং পুনরায় তৈরি করার জন্য স্ক্রিপ্টের চেয়ে ভাল would

এটি বা আপনার খালি ডিবিটির ব্যাক আপ রাখুন এবং এটি পুরানোটির উপরে পুনরুদ্ধার করুন


2
এর কারণ হ'ল ওভারহেড হ'ল ডাটাবেস অন-ডিস্ক ফাইল, লগ ইত্যাদিতে ব্যাপকভাবে ধীর। একটি শালীন ইউনিট পরীক্ষার চলাকালীন 1000 বার ডাটাবেস মুছা ভাবেন
ক্রিস কেএল

0

টেবিলগুলি কেটে যাওয়ার আগে আপনাকে সমস্ত বিদেশী কী সরিয়ে ফেলতে হবে। ডাটাবেসে সমস্ত বিদেশী কী ড্রপ এবং পুনরায় তৈরি করতে চূড়ান্ত স্ক্রিপ্টগুলি তৈরি করতে এই স্ক্রিপ্টটি ব্যবহার করুন । @ ক্রিয়াকলাপ বা 'ড্রপ' এ অ্যাকশন ভেরিয়েবলটি সেট করুন।


0

INFORMATION_SCHEMA.TABLES থেকে 'মুছে ফেলুন' + + নির্বাচন করুন নির্বাচন করুন যেখানে TABLE_TYPE = 'বেস টেবিল'

যেখানে ফলাফল আসে।

কপিরাইট উইন্ডোতে অনুলিপি করুন এবং কমান্ডটি চালান run


0

এটি কিছুটা দেরি হলেও এটি কারওর পক্ষে সহায়তা করতে পারে। আমি কখনও কখনও ফিরে এমন একটি পদ্ধতি তৈরি করি যা টি-এসকিউএল ব্যবহার করে নিম্নলিখিতটি করে:

  1. অস্থায়ী সারণীতে সমস্ত প্রতিবন্ধকতা সঞ্চয় করুন
  2. সমস্ত সীমাবদ্ধতা ফেলে দিন
  3. কিছু টেবিল ব্যতীত সমস্ত টেবিলগুলি কেটে ফেলুন, যার কাটা কাটা দরকার নেই
  4. সমস্ত সীমাবদ্ধতা পুনরুদ্ধার করুন।

আমি এটি আমার ব্লগে এখানে তালিকাভুক্ত করেছি

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