এগুলি আসলে সমতুল্য, তবে এগুলি স্বতন্ত্র প্রকারের, এবং প্রযুক্তিগত প্রতিশব্দ নয়, যেমন ROWVERSION
এবং TIMESTAMP
- যদিও এগুলি এক সময় নথিতে প্রতিশব্দ হিসাবে উল্লেখ করা যেতে পারে । এটি প্রতিশব্দটির কিছুটা আলাদা অর্থ (যেমন নাম বাদে এগুলি পৃথক পৃথক, অদ্ভুত, তাই না?
এমএসডিএন-তে আমি শব্দটি যা ব্যাখ্যা করি তা হ'ল:
এই প্রকারগুলি অভিন্ন, তাদের কেবল আলাদা নাম রয়েছে।
type_id
মান ব্যতীত , এখানে সমস্ত কিছুই একরকম:
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');
দুজনের মধ্যে কোনও আচরণগত পার্থক্য সম্পর্কে আমার একেবারেই জ্ঞান নেই এবং এসকিউএল সার্ভার .5.৫ এ ফিরে যাওয়া সর্বদা তাদেরকে 100% বিনিময়যোগ্য হিসাবে বিবেচনা করেছে।
ডিসিমাল (18,2) এবং NUMERIC (18,2) এর জন্য? একজনকে অপরকে অর্পণ করা প্রযুক্তিগতভাবে একটি "রূপান্তর"?
আপনি যদি স্পষ্টভাবে তা করেন। আপনি একটি টেবিল তৈরি করে এবং তারপরে স্পষ্টভাবে সম্পাদনকারী বা - আপনি আশা করতে পারেন - অন্তর্নিহিত রূপান্তরগুলির জন্য ক্যোয়ারী পরিকল্পনাটি পরিদর্শন করে সহজেই এটি প্রমাণ করতে পারেন। এখানে একটি সাধারণ টেবিল:
CREATE TABLE [dbo].[NumDec]
(
[num] [numeric](18, 0) NULL,
[dec] [decimal](18, 0) NULL
);
এখন এই অনুসন্ধানগুলি চালান এবং পরিকল্পনাটি ক্যাপচার করুন:
DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);
SELECT
CONVERT(DECIMAL(18,0), [num]), -- conversion
CONVERT(NUMERIC(18,0), [dec]) -- conversion
FROM dbo.NumDec
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [num] = @dec -- no conversion
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [dec] = @num; -- no conversion
এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরার * -তে দেখানো হয়েছে , পরিকল্পনাটি আসলেই আকর্ষণীয় নয়:
তবে এক্সপ্রেশন ট্যাবটি নিশ্চিত:
আমি উপরে মন্তব্য হিসাবে, আমরা তাদের জিজ্ঞাসা যেখানে স্পষ্ট রূপান্তর আছে, কিন্তু আমরা তাদের প্রত্যাশা থাকতে পারে যেখানে কোন স্পষ্ট রূপান্তর আছে। মনে হয় অপ্টিমাইজার তাদেরকেও বিনিময়যোগ্য হিসাবে বিবেচনা করবে।
এগিয়ে যান এবং এই পরীক্ষাটিও চেষ্টা করুন (ডেটা এবং সূচি)।
CREATE TABLE [dbo].[NumDec2]
(
[num] [numeric](18, 2) NULL,
[dec] [decimal](18, 2) NULL
);
INSERT dbo.NumDec2([num],[dec])
SELECT [object_id] + 0.12, [object_id] + 0.12
FROM sys.all_columns;
CREATE INDEX [ix_num] ON dbo.NumDec2([num]);
CREATE INDEX [ix_dec] ON dbo.NumDec2([dec]);
এখন এই ক্যোয়ারী চালান:
DECLARE @num NUMERIC(18,2) = -1291334356.88,
@dec NUMERIC(18,2) = -1291334356.88;
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = @num
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = @dec;
পরিকল্পনার কোনও রূপান্তর নেই (আসলে এক্সপ্রেশন ট্যাবটি খালি):
এমনকি এগুলি কোনও অপ্রত্যাশিত রূপান্তর বাড়ে না। অবশ্যই আপনি এটি প্রিডিকেটটিতে আরএইচএসে দেখেন, তবে কোনও ক্ষেত্রেই সন্ধানের সুবিধার্থে কলামের ডেটার বিপরীতে কোনও রূপান্তর ঘটেনি (একটি স্ক্যানের তুলনায় অনেক কম)।
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @dec);
ব্যক্তিগতভাবে, আমি এই শব্দটি ব্যবহার DECIMAL
করতে বেশি পছন্দ করি কারণ এটি অনেক বেশি নির্ভুল এবং বর্ণনামূলক। BIT
এটি "সংখ্যাসূচক "ও।
* Disclaimer: I work for SQL Sentry.