2013-12-12 2 views
24

मैं एक दृश्य पर काम कर रहा हूं, जिसमें मैं दो अलग-अलग सर्वरों से दो टेबल पर एक आंतरिक जुड़ने का उपयोग कर रहा हूं। हम लिंक किए गए सर्वर का उपयोग कर रहे हैं।एसक्यूएल सर्वर क्वेरी में टकराव संघर्ष से छुटकारा पाने के लिए कैसे?

"SQL_Latin1_General_CP1_CI_AS" और "Arabic_CI_AS" आपरेशन के बराबर में के बीच मिलान विरोध को हल नहीं कर सकते हैं: जब क्वेरी चलाने मैं इस संदेश को हो रही है।

मुझे collation के बारे में बहुत कुछ पता नहीं है। इंटरनेट के माध्यम से खोजना मुझे COLLATE का उपयोग करने के लिए समाधान मिलते हैं, लेकिन COLLATE की अवधारणा मुझे स्पष्ट नहीं है। क्या यह किसी भी डेटाबेस के लिए कुछ भी बदल जाएगा? मैं डेटाबेस के लिए कुछ भी बदले बिना समाधान की तलाश में हूं।

इन अवधारणाओं के लिए कोई भी अच्छी शिक्षा सामग्री का स्वागत है।

+0

क्या आप जिस SQL ​​कोड पर काम कर रहे हैं उसे दिखा सकते हैं? –

उत्तर

37

आप किसी विशेष कॉलेशन के लिए क्वेरी में उपयोग किए गए कोलेक्शन को मजबूर कर इस मुद्दे को हल कर सकते हैं, उदा। SQL_Latin1_General_CP1_CI_AS या DATABASE_DEFAULT। उदाहरण के लिए:

SELECT MyColumn 
FROM FirstTable a 
INNER JOIN SecondTable b 
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS 

ऊपर क्वेरी में, a.MyID और b.YourID एक पाठ आधारित डेटा प्रकार के साथ कॉलम होगा। COLLATE का उपयोग डेटाबेस पर डिफ़ॉल्ट collation को अनदेखा करने के लिए क्वेरी को मजबूर करेगा और इसके बजाय प्रदत्त collation का उपयोग करें, इस मामले में SQL_Latin1_General_CP1_CI_AS

असल में यहाँ क्या हो रहा है प्रत्येक डेटाबेस अपनी ही मिलान किया है जो (http://technet.microsoft.com/en-us/library/ms143726.aspx से) "छँटाई नियम, मामला, और अपने डेटा के लिए लहजे संवेदनशीलता गुण प्रदान करता है" और टेक्स्ट का डेटा प्रकार, उदा कॉलम पर लागू होता VARCHAR, CHAR, NVARCHAR, आदि। जब दो डेटाबेस अलग-अलग कॉलेशन होते हैं, तो आप दो अलग-अलग कॉलेशन के बीच संघर्ष को संबोधित किए बिना समान कॉलर्स (=) जैसे टेक्स्ट कॉलम की तुलना नहीं कर सकते हैं।

+0

धन्यवाद रोरीएप। मैं अपना कोड COLLATE के साथ अपडेट कर रहा हूं। यदि कोई समस्या है तो मैं आपको बता दूंगा। तो इसका मतलब है कि डेटाबेस स्तर पर कुछ भी नहीं बदला जाएगा और यह COLLATE केवल SQL स्क्रिप्ट के भीतर ही किया जाएगा। – elmo

+0

धन्यवाद, यह काम किया। मेरी समस्या हल हो गई है। – elmo

+0

दिलचस्प रूप से पर्याप्त, अब तक मैंने सोचा कि मुझे एम मैच बनाने के लिए डेटाबेस स्तर पर संयोजन बदलना है, मुझे नहीं पता था कि मैं 'COLLATE' का उपयोग करके अपनी क्वेरी में एम से मेल खाता हूं! धन्यवाद, यह मुझे परेशानी का बहुत बचाया। – Niklas

3

मैं एक क्वेरी में क्वेरी लपेटकर द्वारा एक ऐसी ही समस्या हल हो गई ...

प्रारंभिक क्वेरी कॉलम अधिकतम या योग समारोह के साथ उप प्रश्नों से आने वाले से कुछ के साथ, उत्पादन की अलग-अलग स्तंभों देने लगता है काम कर रहा था, और अन्य "विशिष्ट" या मामले प्रतिस्थापन और ऐसे के साथ।

मैं के साथ उत्पादन का एक भी क्षेत्र बनाने के प्रयास के बाद मिलान त्रुटि आई ...

select 
rtrim(field1)+','+rtrim(field2)+','+... 

के रूप में मैं इसे लिखा था क्वेरी निष्पादित होगा, लेकिन एसक्यूएल बचत और यह फिर से लोड करने के बाद त्रुटि तब आती है, ।

की तरह कुछ के साथ यह तय ...

select z.field1+','+z.field2+','+... as OUTPUT_REC 
from (select rtrim(field1), rtrim(field2), ...) z 

कुछ क्षेत्रों, एक सबक्वेरी के "अधिकतम" कर रहे हैं एक मामले प्रतिस्थापन अगर शून्य के साथ और दूसरों तिथि खाने हैं, और कुछ छोड़ दिया जाता है मिलती अप घाव (हो सकता है नल हो) ... दूसरे शब्दों में, मिश्रित क्षेत्र के प्रकार। मेरा मानना ​​है कि ओएस collation और डेटाबेस collation के कारण होने वाली समस्या का कारण थोड़ा अलग है, लेकिन अंतिम चयन से पहले सभी को छंटनी तारों में परिवर्तित करके, यह सब कुछ एसक्यूएल में करता है।

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