আমি যতদূর বলতে পারি ২০০৮ সালে কোনও উচ্চতর সীমা নেই।
এসকিউএল সার্ভার ২০০৫-এ আপনার প্রশ্নের কোডটি @GGMMsg
ভেরিয়েবলের সাথে অ্যাসাইনমেন্টে ব্যর্থ হয়
সর্বাধিক অনুমোদিত আকার 2,147,483,647 বাইটের বাইরে LOB বৃদ্ধির চেষ্টা করা হচ্ছে।
নীচের কোডটি ব্যর্থ হয়
প্রত্যাহার: ফলাফলের দৈর্ঘ্য লক্ষ্য বৃহত ধরণের দৈর্ঘ্যের সীমা (2 জিবি) অতিক্রম করে।
তবে দেখা যাচ্ছে যে এই সীমাবদ্ধতাগুলি নিঃশব্দে সরানো হয়েছে। ২০০৮-তে
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
ফিরে আসে
8589767761
আমি এটি আমার 32 বিট ডেস্কটপ মেশিনে চালিয়েছি যাতে এই 8 জিবি স্ট্রিংটি ঠিকানাযোগ্য মেমরির চেয়ে বেশি
চলছে
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
ফিরে এসেছে
internal_objects_alloc_page_co
2144456
সুতরাং আমি অনুমান করি যে এটি কেবলমাত্র দৈর্ঘ্যে কোনও বৈধতা ছাড়াই LOB
পৃষ্ঠাগুলিতে সঞ্চিত হবে tempdb
। পৃষ্ঠা গণনা বৃদ্ধি সমস্ত SET @y = REPLICATE(@y,92681);
বিবৃতিতে যুক্ত ছিল । প্রাথমিক পরিবর্তনশীল অ্যাসাইনমেন্ট @y
এবং LEN
গণনা এটি বাড়েনি।
এটি উল্লেখ করার কারণ কারণ পৃষ্ঠার গণনা আমার প্রত্যাশার চেয়ে বিশাল বেশি huge একটি 8 কেবি পৃষ্ঠা অনুমান করে তারপরে এটি 16.36 গিগাবাইটে কার্যকর হবে যা সম্ভবত কম-বেশি দ্বিগুণ যা প্রয়োজনীয় বলে মনে হয়। আমি অনুমান করি যে এটি সম্ভবত স্ট্রিং কনটেনটেশন অপারেশনের অদক্ষতার কারণে পুরো বিশাল স্ট্রিংটি অনুলিপি করতে হবে এবং বিদ্যমান স্ট্রিংয়ের শেষের দিকে যোগ করতে সক্ষম হবার চেয়ে শেষ পর্যন্ত যোগ করতে হবে। দুর্ভাগ্যক্রমে এই মুহুর্তে .WRITE
পদ্ধতিটি ভার্চার (সর্বোচ্চ) ভেরিয়েবলগুলির জন্য সমর্থিত নয় ।
যোগ
আমিও concatenating সঙ্গে আচরণ পরীক্ষিত থাকেন nvarchar(max) + nvarchar(max)
এবং nvarchar(max) + varchar(max)
। এই উভয়ই 2 জিবি সীমা অতিক্রম করতে দেয়। এর ফলাফলগুলি একটি টেবিলের মধ্যে সংরক্ষণের চেষ্টা করে Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
আবার ত্রুটি বার্তাটি দিয়ে ব্যর্থ হয়। এর জন্য স্ক্রিপ্টটি নীচে রয়েছে (এটি চালাতে অনেক সময় নিতে পারে)।
DECLARE @y1 VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),2147483647);
SET @y1 = @y1 + @y1;
SELECT LEN(@y1), DATALENGTH(@y1)
DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823);
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2)
DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3)
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test
declare @x varchar(max) = 'XX'; SELECT LEN(REPLICATE(@x,2147483647))
4294967294
আমার জন্য দেয় তবে দৌড়াতে অনেক সময় লাগে - এমনকিSELECT
ফিরে আসার পরেও নিশ্চিত হন না যে অতিরিক্ত সময়টি কী ব্যয় করছে।