मुझे एक ही समस्या थी, सिवाय इसके कि मेरे पास 2 अरब पंक्तियों वाली एक तालिका है, इसलिए अगर मैंने ऐसा किया तो लॉग फ़ाइल का कोई अंत नहीं होगा, यहां तक कि थोक-लॉगिंग पर सेट पुनर्प्राप्ति मॉडल के साथ भी:
insert into newtable select * from oldtable
इसलिए मैं डेटा के ब्लॉक पर काम करता हूं। इस तरह, यदि स्थानांतरण बाधित होता है, तो आप इसे पुनः आरंभ करें। साथ ही, आपको तालिका जितनी बड़ी लॉग फ़ाइल की आवश्यकता नहीं है। आपको कम tempdb I/O भी लगता है, पता नहीं क्यों।
set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = isNull(max(id),0) + 1
from newtable
select @LastID = max(ID)
from oldtable
while @StartID < @LastID
begin
set @EndID = @StartID + 1000000
insert into newtable (FIELDS,GO,HERE)
select FIELDS,GO,HERE from oldtable (NOLOCK)
where id BETWEEN @StartID AND @EndId
set @StartID = @EndID + 1
end
set identity_insert newtable off
go
आपको आईडी से निपटने के तरीके को बदलने की आवश्यकता हो सकती है, यह सबसे अच्छा काम करता है यदि आपकी तालिका आईडी द्वारा क्लस्टर की जाती है।