वे वास्तव में समान हैं, लेकिन वे स्वतंत्र प्रकार हैं, और तकनीकी रूप से समानार्थी शब्द नहीं हैं, जैसे ROWVERSIONऔर TIMESTAMP- हालांकि उन्हें एक समय में दस्तावेज में समानार्थक के रूप में संदर्भित किया गया हो सकता है । यह पर्यायवाची का थोड़ा भिन्न अर्थ है (उदाहरण के लिए वे नाम के सिवाय अविवेच्य हैं, न कि दूसरे के लिए एक उपनाम)। विडंबना, सही?
MSDN में शब्दांकन से मैं क्या व्याख्या करता हूं:
ये प्रकार समान हैं, उनके पास बस अलग-अलग नाम हैं।
के अलावा type_idमूल्यों, यहाँ सब एक समान हो:
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');
मुझे दोनों के बीच किसी भी व्यवहार संबंधी मतभेदों का बिल्कुल भी ज्ञान नहीं है, और SQL सर्वर 6.5 पर वापस जाने पर, उन्हें हमेशा 100% विनिमेय माना जाता है।
DECIMAL (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.