2012-05-02 15 views
6

मैं एसक्यूएल सर्वर में मानक ASP.NET सदस्यता तालिका संरचना का उपयोग कर रहा है और मैन्युअल प्रबंधन स्टूडियो में क्वेरी करने का एक सा कर रहा था और भाग गया इस क्वेरीSQL क्वेरी काम नहीं कर के रूप में उम्मीद

SELECT * 
FROM [aspnet_Users] 
WHERE UserId = '2ac5dd56-2630-406a-9fb8-d4445bc781da&cID=49' 

सूचना & CID = 49 अंत में - मैंने इसे एक क्वेरीस्ट्रिंग से कॉपी किया और उस भाग को हटाने के लिए भूल गया।

हालांकि, मेरे आश्चर्य से यह डेटा सही ढंग से लौटा (आईडी 2ac5dd56-2630-406a-9fb8-d4445bc781da के साथ कोई उपयोगकर्ता है) - कोई विचार यह क्यों काम करता है? मेरे दिमाग में यह मेल नहीं होना चाहिए या शायद एक त्रुटि फेंकने की संभावना है क्योंकि यह एक ग्रिड में परिवर्तित करने में सक्षम नहीं होना चाहिए?

+0

मूल्य डीबी पर excatly क्या है से उद्धृत किया गया है? –

उत्तर

3

uniqueidentifier प्रकार एक चरित्र अभिव्यक्ति से रूपांतरण के प्रयोजनों के लिए एक चरित्र प्रकार माना जाता है, और इसलिए एक चरित्र प्रकार में कनवर्ट करने के लिए काट-छांट के नियमों के अधीन है। यही है, जब चरित्र अभिव्यक्तियों को एक अलग आकार के चरित्र डेटा प्रकार में परिवर्तित किया जाता है, मान जो नए डेटा प्रकार के लिए बहुत लंबे होते हैं को छोटा कर दिया जाता है।

क्योंकि अद्वितीय पहचानकर्ता प्रकार 36 वर्ण तक सीमित है, उस लंबाई से अधिक वर्णों को छोटा कर दिया गया है।

ध्यान दें कि ऊपर MSDN

+0

+1। लेकिन यह अजीब .... मैंने उसे A123 खोजने के लिए कहा और ए 123blabla नहीं ..... –

+0

धन्यवाद, जो अब और अधिक समझ में आता है लेकिन मैं सहमत हूं कि यह अजीब है - अगर मैं 36 वर्ण से कम मान में जाता हूं तो मैं एक रूपांतरण त्रुटि प्राप्त करें, इसलिए मेरी उम्मीद यह होगी कि यदि मैं और अधिक पास हो गया तो यह भी असफल हो जाएगा! –

2

पार्सर (उल्लेखनीय) उदार है जब स्ट्रिंग शाब्दिक परिवर्तित शाब्दिक guid के लिए, जाहिरा तौर पर:

SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52a' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52-!' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52~#5' AS uniqueidentifier) 
SELECT CAST('E63F4FFC-8574-428B-B6B8-95CFCA05ED52$3%] ' AS uniqueidentifier) 

सभी एक ही परिणाम दे, कोई त्रुटि।

This is documented behaviour, इसलिए हम वास्तव में शिकायत नहीं कर सकता:

निम्न उदाहरण डेटा की काट-छांट को दर्शाता है जब मूल्य डेटा प्रकार में बदला जा रहा के लिए बहुत लंबा है। चूंकि अद्वितीय पहचानकर्ता प्रकार 36 वर्णों तक सीमित है, तो वर्णों की लंबाई उस अवधि से अधिक हो जाती है।

DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong'; 
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue; 

परिणाम सेट यहां है।

String          TruncatedValue 
-------------------------------------------- ------------------------------------ 
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0 

(1 row(s) affected) 
+0

धन्यवाद, मैं अब समझता हूं - हालांकि एक अजीब लगता है! –

संबंधित मुद्दे