नीचे वरीयता क्रम में SQL सर्वर डेटा प्रकारों वाली एक सूची है।
- उपयोगकर्ता-परिभाषित डेटा प्रकार (उच्चतम)
sql_variant
xml
datetimeoffset
datetime2
datetime
-
smalldatetime
date
time
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar
(nvarchar(max)
. सहित )nchar
varchar
(varchar(max)
. सहित) )char
varbinary
(varbinary(max)
. सहित )binary
(सबसे कम)
जब आप विभिन्न डेटा प्रकारों के ऑपरेंड को संयोजित करने के लिए एक ऑपरेटर का उपयोग करते हैं, तो निम्न प्राथमिकता वाले डेटा प्रकार को पहले उच्च प्राथमिकता वाले डेटा प्रकार में परिवर्तित किया जाता है।
यदि रूपांतरण समर्थित अंतर्निहित रूपांतरण नहीं है, तो एक त्रुटि लौटा दी जाती है।
यदि दोनों ऑपरेंड एक ही प्रकार के हैं, तो कोई रूपांतरण नहीं किया जाता है (या आवश्यक) और ऑपरेशन का परिणाम ऑपरेंड के डेटा प्रकार का उपयोग करता है।
उदाहरण
यहां एक निहित रूपांतरण का एक उदाहरण दिया गया है जो सफल होता है:
SELECT 1 * 1.00;
परिणाम:
1.00
यहां, बाएं ऑपरेंड को दाएं ऑपरेंड के डेटा प्रकार में बदल दिया गया था।
इसे करने का एक और स्पष्ट तरीका यहां दिया गया है:
DECLARE
@n1 INT,
@n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1 * @n2;
परिणाम:
1.00
इस मामले में मैंने स्पष्ट रूप से बाएं ऑपरेंड को INT
. के रूप में घोषित किया है और दायां संकार्य DECIMAL(5, 2)
. के रूप में ।
हम sys.dm_exec_describe_first_result_set
के साथ परिणामों की और जांच कर सकते हैं प्रणाली गतिशील प्रबंधन समारोह।
यह फ़ंक्शन हमें क्वेरी में लौटाए गए प्रत्येक कॉलम के डेटा प्रकार की जांच करने में सक्षम बनाता है:
SELECT
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
'DECLARE @n1 INT, @n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1, @n2, @n1 * @n2;',
null,
0);
परिणाम:
+--------------------+--------------+-------------+---------+ | system_type_name | max_length | precision | scale | |--------------------+--------------+-------------+---------| | int | 4 | 10 | 0 | | decimal(5,2) | 5 | 5 | 2 | | decimal(16,2) | 9 | 16 | 2 | +--------------------+--------------+-------------+---------+
यहां, हम देख सकते हैं कि प्रत्येक पंक्ति क्वेरी द्वारा लौटाए गए प्रत्येक कॉलम का प्रतिनिधित्व करती है। इसलिए, पहला कॉलम एक INT
था , दूसरा कॉलम था DECIMAL(5,2)
, और तीसरा कॉलम DECIMAL(16,2)
।
तो SQL सर्वर ने वास्तव में एक DECIMAL(16,2)
लौटाया , भले ही मूल दशमलव मान a DECIMAL(5,2)
था .
रूपांतरण त्रुटि का उदाहरण
जैसा कि उल्लेख किया गया है, यदि रूपांतरण समर्थित अंतर्निहित रूपांतरण नहीं है, तो एक त्रुटि वापस आ जाती है:
SELECT 'Age: ' + 10;
परिणाम:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Age: ' to data type int.
इस मामले में, मैं एक स्ट्रिंग को जोड़ने की कोशिश कर रहा था (VARCHAR
) और एक नंबर (INT
.) ) INT
. के रूप में देखा जा रहा है VARCHAR
. की तुलना में उच्च प्राथमिकता है , SQL सर्वर ने स्ट्रिंग को एक INT
. में परोक्ष रूप से रूपांतरित करने का प्रयास किया ।
यह विफल रहा, क्योंकि इस स्ट्रिंग को पूर्णांक में परिवर्तित नहीं किया जा सकता है।
इसे दूर करने के लिए, हम सबसे पहले INT
. को कन्वर्ट कर सकते हैं करने के लिए VARCHAR
:
SELECT 'Age: ' + CAST(10 AS VARCHAR(2));
परिणाम:
Age: 10
अब दोनों ऑपरेंड में एक ही डेटा प्रकार है, और इसलिए SQL सर्वर बिना किसी अंतर्निहित रूपांतरण की आवश्यकता के सफलतापूर्वक ऑपरेशन करता है।
इस विशेष ऑपरेशन को करने का एक और तरीका है CONCAT()
समारोह:
SELECT CONCAT('Age: ', 10);
परिणाम:
Age: 10
CONCAT()
फ़ंक्शन एक स्ट्रिंग फ़ंक्शन है और इसलिए संयोजन से पहले सभी तर्कों को स्ट्रिंग प्रकारों में परोक्ष रूप से परिवर्तित करता है। इसलिए, हमें स्पष्ट रूप से रूपांतरण करने की कोई आवश्यकता नहीं थी।
हालाँकि, यदि स्ट्रिंग ऑपरेंड को किसी संख्या में परोक्ष रूप से परिवर्तित किया जा सकता है, तो यह +
का उपयोग करते समय कोई त्रुटि उत्पन्न नहीं करेगा। ऑपरेटर:
SELECT '10' + 10;
परिणाम:
20
लेकिन इस मामले में, +
ऑपरेटर एक स्ट्रिंग कॉन्सटेनेशन ऑपरेटर के बजाय एक अतिरिक्त गणितीय ऑपरेटर में बदल जाता है।