দ্বারা অনুপ্রাণিত @Paul এর উত্তর , আমি কিছু গবেষণা করেছেন এবং দেখা গেছে যে এটা সত্য যে স্ট্যাকের স্থান সীমা concatenations সংখ্যা আছে, যখন এবং যে স্ট্যাকের স্থান উপলব্ধ মেমরি একটি ফাংশন এবং এইভাবে পরিবর্তিত হয়, নিম্নলিখিত দুই পয়েন্ট এছাড়াও সত্য :
- একটি একক বিবৃতিতে অতিরিক্ত যুক্তি ছড়িয়ে দেওয়ার একটি উপায় রয়েছে, এবং
- প্রাথমিক স্ট্যাক স্পেস সীমাবদ্ধতা অতিক্রম করার জন্য এই পদ্ধতিটি ব্যবহার করে, একটি আসল যৌক্তিক সীমা (এটি ভিন্ন হয় বলে মনে হয় না) পাওয়া যেতে পারে
প্রথমত, আমি পলের পরীক্ষার কোডটি স্ট্রিংকে সংযুক্ত করার জন্য রূপান্তর করেছি:
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'
DECLARE @S VARCHAR(MAX), @A VARCHAR(MAX) = ''a'';
SET @S = @A';
SET @SQL += REPLICATE(CONVERT(NVARCHAR(MAX), N' + @A'), 3312) + N';';
-- SET @S = @A + @A + @A...
SET @SQL += N'SELECT DATALENGTH(@S) AS [Chars In @S];';
EXECUTE (@SQL);
এই পরীক্ষার মাধ্যমে, আমার অ-দুর্দান্ত-ল্যাপটপ চালানোর সময় আমি যে সর্বোচ্চটি পেতে পারি (কেবলমাত্র 6 গিগাবাইট র্যাম) ছিল:
- 3311 (এসসিএল সার্ভার 2017 এক্সপ্রেস সংস্করণ লোকালডিবি (14.0.3006) ব্যবহার করে 3312 মোট অক্ষর প্রদান করে)
- 3512 (এসকিউএল সার্ভার 2012 বিকাশকারী সংস্করণ এসপি 4 (কেবি 4018073) (11.0.7001) ব্যবহার করে 3513 মোট অক্ষর প্রদান করে)
ত্রুটি পাওয়ার আগে 8631 ।
এরপরে, আমি প্রথম বন্ধনী ব্যবহার করে কনটেটেশনগুলি গোষ্ঠীভুক্ত করার চেষ্টা করেছি যাতে এই ক্রিয়াকলাপটি একাধিক গোষ্ঠীর সংক্ষেপণকে বোঝায়। উদাহরণ স্বরূপ:
SET @S = (@A + @A + @A + @A) + (@A + @A + @A + @A) + (@A + @A + @A + @A);
এটি করে আমি 3312 এবং 3513 ভেরিয়েবলের আগের সীমা ছাড়িয়ে ভালভাবে যেতে পেরেছিলাম। আপডেট করা কোডটি হ'ল:
DECLARE @SQL VARCHAR(MAX), @Chunk VARCHAR(MAX);
SET @SQL = '
DECLARE @S VARCHAR(MAX), @A VARCHAR(MAX) = ''a'';
SET @S = (@A+@A)';
SET @Chunk = ' + (@A' + REPLICATE(CONVERT(VARCHAR(MAX), '+@A'), 42) + ')';
SET @SQL += REPLICATE(CONVERT(VARCHAR(MAX), @Chunk), 762) + ';';
SET @SQL += 'SELECT DATALENGTH(@S) AS [Chars In @S];';
-- PRINT @SQL; -- for debug
-- SET @S = (@A+@A) + (@A + @A...) + ...
EXECUTE (@SQL);
সর্বাধিক মানগুলি (আমার জন্য) এখন 42
প্রথমটির জন্য ব্যবহার করতে হবে REPLICATE
, এইভাবে প্রতি গ্রুপে ৪৩ টি ভেরিয়েবল ব্যবহার করা হবে এবং তারপরে 762
দ্বিতীয়টির জন্য ব্যবহার করা হবে REPLICATE
, এভাবে প্রতিটি ৪৩ টি ভেরিয়েবলের 6262২ টি গ্রুপ ব্যবহার করা হবে। প্রাথমিক গ্রুপটি দুটি ভেরিয়েবলের সাথে হার্ড-কোডড।
আউটপুট এখন দেখায় যে চলকটিতে 32,768 টি অক্ষর রয়েছে @S
। আমি যদি প্রাথমিক গোষ্ঠীকে ন্যায়বিচারের (@A+@A+@A)
পরিবর্তে আপডেট করে থাকি (@A+@A)
তবে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:
এমএসজি 8632, স্তর 17, রাজ্য 2, লাইন এক্সএক্সএক্সএক্সএক্স
অভ্যন্তরীণ ত্রুটি: একটি এক্সপ্রেশন পরিষেবা সীমাতে পৌঁছে গেছে। আপনার ক্যোয়ারিতে সম্ভাব্য জটিল এক্সপ্রেশনগুলি সন্ধান করুন এবং সেগুলি সরল করার চেষ্টা করুন।
লক্ষ্য করুন যে ত্রুটি সংখ্যাটি আগের চেয়ে পৃথক। এটি এখন: 8632 । এবং, আমি আমার এসকিউএল সার্ভার 2012 উদাহরণটি বা এসকিউএল সার্ভার 2017 উদাহরণটি ব্যবহার করি কিনা তাতেই আমার এই সীমাবদ্ধতা রয়েছে।
এটা সম্ভবত কোন কাকতালীয় যে উপরের সীমা এখানে - 32.768 - সর্বোচ্চ ধারণক্ষমতা এর SMALLINT
( Int16
.NET মধ্যে) যদি থেকে শুরু 0
(সর্বোচ্চ মান 32.767 কিন্তু অনেক / বেশীর ভাগ প্রোগ্রামিং ভাষায় অ্যারে 0-ভিত্তিক)।