2010-12-03 13 views
71

कहाँ [CastleType] एसक्यूएल सर्वर में डेटा प्रकार "पाठ" और क्वेरी के रूप में सेट कर दिया जाता है:कहां एसक्यूएल सर्वर पर खंड "पाठ" डेटा प्रकार

The data types TEXT and VARCHAR are incompatible in the equal to operator.

:

SELECT * 
FROM [Village] 
WHERE [CastleType] = 'foo' 

मैं त्रुटि मिलती है

क्या मैं इस डेटा प्रकार को WHERE क्लॉज से क्वेरी नहीं कर सकता?

+8

'टेक्स्ट 'के बजाय' वर्चर (MAX)' का उपयोग करें - डेटाटाइप को –

उत्तर

10

आप = ऑपरेटर के साथ text के खिलाफ तुलना नहीं कर सकते, लेकिन इसके बजाय here सूचीबद्ध तुलना कार्यों में से एक के लिए इस्तेमाल किया जाना चाहिए। पृष्ठ के शीर्ष पर बड़े चेतावनी बॉक्स को भी ध्यान दें, यह महत्वपूर्ण है।

79

आप = के बजाय LIKE का उपयोग कर सकते हैं। किसी भी वाइल्डकार्ड के बिना इसका एक ही प्रभाव होगा।

DECLARE @Village TABLE 
     (CastleType TEXT) 

INSERT INTO @Village 
VALUES 
    (
    'foo' 
) 

SELECT * 
FROM @Village 
WHERE [CastleType] LIKE 'foo' 

text बहिष्कृत किया गया है। varchar(max) पर बदलना काम करना आसान होगा।

डेटा भी होने की संभावना कितनी बड़ी है? यदि आप समानता तुलना करने जा रहे हैं तो आप आदर्श रूप से इस कॉलम को इंडेक्स करना चाहते हैं। यह संभव नहीं है यदि आप 900 बाइट्स से अधिक के रूप में कॉलम घोषित करते हैं, हालांकि आप एक गणना checksum या hash कॉलम जोड़ सकते हैं जिसका उपयोग इस प्रकार की क्वेरी को गति देने के लिए किया जा सकता है।

2

त्रुटि संदेश क्या नहीं है। यह कहता है कि आप = ऑपरेटर का उपयोग नहीं कर सकते हैं। उदाहरण के लिए LIKE 'foo' का प्रयास करें।

+0

'कर्नल इन (' foo ',' bar ')' मूल रूप से 'Col =' foo 'या Col = 'बार' और एक ही समस्या होगी। –

+0

@ मार्टिन: हाइलाइट के लिए धन्यवाद, मुझे इसके बारे में पता नहीं था। मैं इसे ठीक कर दूंगा। –

0

एक अन्य विकल्प होगा:

SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0 
+0

मुझे संदेह है कि 'जैसे' foo'' इस दृष्टिकोण से बेहतर कार्डिनालिटी अनुमान दे सकता है लेकिन 100% निश्चित नहीं है। –

+0

@ मार्टिन: चूंकि आप टेक्स्ट टेक्स्ट को इंडेक्स नहीं कर सकते हैं, मुझे लगता है कि आप किसी भी मामले में एक पूर्ण टेबल स्कैन के साथ समाप्त हो जाएंगे। –

+0

मैं सहमत हूं लेकिन यह अभी भी पंक्तियों का अनुमान लगाने के लिए कॉलम पर आंकड़ों का उपयोग करेगा जो वापस लौटाए जाएंगे जो निर्णय लेने आदि को प्रभावित कर सकते हैं। –

-2

मैं MySQL का उपयोग कर रहा है और इस प्रश्न मेरे लिए काम करता है:

SELECT * 
FROM @Village 
WHERE CastleType LIKE '%foo%'; 
+1

ओपी एमएसएसएलएल का उपयोग MySQL नहीं कर रहा है। – CarstenSchmitz

2

आप (टेबल ही varchar का उपयोग करने पर डेटा-प्रकार बदल नहीं सकते हैं अधिकतम), तो यह करने के लिए आपकी क्वेरी को बदलें:

SELECT * 
FROM [Village] 
WHERE CONVERT(VARCHAR(MAX), [CastleType]) = 'foo' 
16

इस

: प्रयास करें
SELECT * 
FROM [Village] 
WHERE CONVERT(VARCHAR, CastleType) = 'foo' 
+0

यह टेक्स्ट टेक्स्ट में डेटा को सीधे देखने में सक्षम होने के लिए भी उपयोगी है यदि आप कुछ टूल्स जैसे एसक्यूएल सर्वर के लिए उपयोग कर रहे हैं जो पहले निष्पादन में बीएलओबी प्रकार फ़ील्ड को देखने के लिए सुरक्षित है। फ़ील्ड दिखाने के लिए आप हमेशा टोड को बताने के लिए फ़ील्ड पर क्लिक कर सकते हैं, लेकिन यह दो चरण की प्रक्रिया है। – Roger

+0

ध्यान दें कि यह संभवतः आपकी क्वेरी [गैर-योग्यता] (https://en.wikipedia.org/wiki/Sargable) बना देगा। – Heinzi

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