মার্টিনের উত্তর নিয়ে আর কোনওভাবেই আলোচনার পরিবর্তে আমি POWER()
এখানে আমার বাকী সমস্ত ফলাফল যুক্ত করব ।
আপনার নিকার্স ধরে রাখা।
প্রস্তাবনা
প্রথমে, আমি আপনার কাছে একটি, এমএসডিএন ডকুমেন্টেশন উপস্থাপন করছিPOWER()
:
বাক্য গঠন
POWER ( float_expression , y )
যুক্তি
float_expression
প্রকারের ফ্লোট বা এমন এক ধরণের অভিব্যক্তি যা স্পষ্টতই ফ্লোটে রূপান্তরিত হতে পারে।
রিটার্ন প্রকার
হিসাবে একই float_expression
।
আপনি শেষ লাইনে যে POWER()
রিটার্নের টাইপটি FLOAT
পড়েছেন তা শেষ করেই সিদ্ধান্ত নিতে পারেন , তবে আবার পড়ুন। float_expression
"টাইপ ফ্লোট বা এমন এক ধরণের যা স্পষ্টতই ফ্লোটে রূপান্তরিত হতে পারে"। সুতরাং, এর নাম থাকা সত্ত্বেও, float_expression
এটি আসলে ক FLOAT
, ক DECIMAL
, বা একটি হতে পারে INT
। আউটপুট যেহেতু POWER()
একই float_expression
, তাই এটিও এই ধরণেরগুলির মধ্যে একটি হতে পারে।
সুতরাং আমাদের কাছে রিটার্ন টাইপের সাথে একটি স্কেলার ফাংশন রয়েছে যা ইনপুটটির উপর নির্ভর করে। এটা হতে পারে?
পর্যবেক্ষণ
আমি উপস্থাপন আপনি বি, একটি পরীক্ষা প্রদর্শক প্রদর্শন করা POWER()
তার ইনপুট উপর নির্ভর করে বিভিন্ন ধরনের তথ্য তার আউটপুট কাস্ট ।
SELECT
POWER(10, 3) AS int
, POWER(1000000000000, 3) AS numeric0 -- one trillion
, POWER(10.0, 3) AS numeric1
, POWER(10.12305, 3) AS numeric5
, POWER(1e1, 3) AS float
INTO power_test;
EXECUTE sp_help power_test;
DROP TABLE power_test;
সম্পর্কিত ফলাফল:
Column_name Type Length Prec Scale
-------------------------------------------------
int int 4 10 0
numeric0 numeric 17 38 0
numeric1 numeric 17 38 1
numeric5 numeric 17 38 5
float float 8 53 NULL
কি মনে হচ্ছে, ঘটছে করা হয় POWER()
কাস্ট float_expression
যে ফিট এটা সহ না ক্ষুদ্রতম ধরনের মধ্যে BIGINT
।
অতএব, SELECT POWER(10.0, 38);
একটি ওভারফ্লো ত্রুটির সাথে ব্যর্থ হয় কারণ 10.0
কাস্ট হয়ে যায় NUMERIC(38, 1)
যা 10 38 এর ফলাফল ধরে রাখতে যথেষ্ট বড় নয় । কারণ 10 38 দশমিকের আগে 39 অঙ্ক নিতে প্রসারিত, যেখানে NUMERIC(38, 1)
দশমিক প্লাস একের আগে 37 অঙ্ক সংরক্ষণ করতে পারে। অতএব, সর্বোচ্চ মানটি NUMERIC(38, 1)
10 37 - 0.1 ধরে রাখতে পারে ।
এই বোঝার সাথে সজ্জিত হয়ে আমি নীচে আরও একটি ওভারফ্লো ব্যর্থতা কাটিয়ে উঠতে পারি।
SELECT POWER(1000000000, 3); -- one billion
এক বিলিয়ন (প্রথম উদাহরণ থেকে এক ট্রিলিয়ন এর বিপরীতে, যা নিক্ষেপ করা হয় NUMERIC(38, 0)
) কেবলমাত্র একটি এনে ফিট করার জন্য যথেষ্ট ছোট INT
। তৃতীয় শক্তিতে উত্থাপিত এক বিলিয়ন, তবে এটির পক্ষে খুব বড় INT
, অতএব ওভারফ্লো ত্রুটি।
অন্যান্য বেশ কয়েকটি ফাংশন অনুরূপ আচরণ প্রদর্শন করে, যেখানে তাদের আউটপুট টাইপ তাদের ইনপুটটির উপর নির্ভরশীল:
- গাণিতিক ফাংশন :
POWER()
, CEILING()
, FLOOR()
, RADIANS()
, DEGREES()
, এবংABS()
- সিস্টেম ফাংশন এবং এক্সপ্রেশন :
NULLIF()
, ISNULL()
, COALESCE()
, IIF()
, CHOOSE()
, এবং CASE
এক্সপ্রেশন
- পাটিগণিত অপারেটর : উভয়
SELECT 2 * @MAX_INT;
এবং SELECT @MAX_SMALLINT + @MAX_SMALLINT;
উদাহরণস্বরূপ, যখন ভ্যারিয়েবলগুলি নামযুক্ত ডেটা টাইপের হয় তখন গাণিতিক ওভারফ্লো হয়।
উপসংহার
এই বিশেষ ক্ষেত্রে, সমাধানটি ব্যবহার করা SELECT POWER(1e1, precision)...
। 1e1
কাস্টিং হয়ে যাওয়ার পরে এটি সমস্ত সম্ভাব্য নির্ভুলতার জন্য কাজ করবে FLOAT
, যা হাস্যকরভাবে প্রচুর সংখ্যক ধরে রাখতে পারে ।
যেহেতু এই ফাংশনগুলি খুব সাধারণ, তাই এটি বোঝা গুরুত্বপূর্ণ যে আপনার ফলাফলগুলি বৃত্তাকার হতে পারে বা তাদের আচরণের কারণে ওভারফ্লো ত্রুটির কারণ হতে পারে। আপনি যদি নিজের আউটপুটটির জন্য নির্দিষ্ট ডেটা টাইপের প্রত্যাশা বা নির্ভর করেন তবে প্রাসঙ্গিকভাবে ইনপুটটিকে প্রয়োজনীয় হিসাবে কাস্ট করুন।
বাচ্চারা, এখন আপনি যে এটি জানেন, আপনি এগিয়ে এবং সমৃদ্ধ হতে পারে।