2013-10-07 13 views
5

मेरे पास ओरेकल डेटाबेस को हिट करने के लिए SQL सर्वर में एक लिंक सर्वर सेटअप है। मेरे पास SQL ​​सर्वर में एक क्वेरी है जो डॉट नोटेशन का उपयोग करते हुए ओरेकल तालिका पर जुड़ती है। मुझे ओरेकल से "कोई डेटा नहीं मिला" त्रुटि मिल रही है। ओरेकल पक्ष पर, मैं एक टेबल (एक दृश्य नहीं) मार रहा हूं और कोई संग्रहित प्रक्रिया शामिल नहीं है।एसक्यूएल सर्वर से जुड़ा हुआ सर्वर ऑरैकल डेटा देता है जब डेटा मौजूद होता है

सबसे पहले, जब कोई डेटा नहीं है तो मुझे केवल शून्य पंक्तियां मिलनी चाहिए, न कि त्रुटि।
दूसरा, वास्तव में इस मामले में डेटा होना चाहिए।
तीसरा, मैंने केवल पीएल/एसक्यूएल कोड में ओआरए -01403 त्रुटि देखी है; एसक्यूएल में कभी नहीं।

यह पूर्ण त्रुटि संदेश है:
OLE DB प्रदाता जुड़ा हुआ सर्वर "OM_ORACLE" के लिए "OraOLEDB.Oracle" लौटे संदेश "ORA-01403: कोई डेटा नहीं मिला"।
संदेश 7346, स्तर 16, राज्य 2, रेखा 1 लिंक किए गए सर्वर "OM_ORACLE" के लिए ओएलई डीबी प्रदाता "OraOLEDB.Oracle" से पंक्ति का डेटा नहीं प्राप्त कर सकता है।

यहां कुछ और विवरण दिए गए हैं, लेकिन संभवतः इसका कोई मतलब नहीं है क्योंकि आपके पास टेबल और डेटा नहीं है।

select * 
    from eopf.Batch b join eopf.BatchFile bf 
       on b.BatchID = bf.BatchID 
      left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
       on bf.ReferenceID = du.documentUploadID; 




मैं नहीं समझ सकता कारण है कि मैं एक "कोई डेटा नहीं मिला" त्रुटि मिलती है:
यह समस्या के साथ क्वेरी है। नीचे दी गई क्वेरी एक ही ओरेकल तालिका का उपयोग करती है और कोई डेटा नहीं देती है लेकिन मुझे कोई त्रुटि नहीं मिलती है - मुझे बस कोई पंक्ति वापस नहीं मिलती है।

select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID = -1 



रिटर्न डेटा नीचे दिए गए क्वेरी। मैंने अभी शामिल होने से SQL सर्वर तालिकाओं में से एक को हटा दिया है। लेकिन बैच तालिका को हटाने से बैचफाइल से लौटाई गई पंक्तियां नहीं बदली जाती हैं (दोनों मामलों में 271 पंक्तियां - बैचफाइल में सभी पंक्तियां बैच प्रविष्टि होती हैं)। यह अभी भी उसी बैचफाइल पंक्तियों में उसी ओरेकल पंक्तियों में शामिल होना चाहिए।

select * 
from eopf.BatchFile bf 
    left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
     on bf.ReferenceID = du.documentUploadID; 



और इस क्वेरी 5 पंक्तियाँ देता है। यह मूल क्वेरी से वही 5 होना चाहिए। (मैं इसका उपयोग नहीं कर सकता क्योंकि मुझे बैच और बैचफाइल टेबल से डेटा चाहिए)।

 select * 
    from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
    where du.documentUploadId 
    in 
    (
    select bf.ReferenceID 
    from eopf.Batch b join eopf.BatchFile bf 
       on b.BatchID = bf.BatchID); 

क्या किसी ने इस त्रुटि का अनुभव किया है?

उत्तर

1

मुझे एक ही समस्या है। समाधान 1: ओरेकल डेटाबेस से डेटा को एक temp तालिका में लोड करें और उसके बाद उस temp तालिका में शामिल हों - यहां a link है।

इस पोस्ट से a link आप यह पता लगा सकते हैं कि समस्या बाएं शामिल होने के साथ हो सकती है। मैंने अपनी समस्या के साथ जांच की है और afeter परिवर्तन क्वेरी यह समस्या हल करती है।

0

मेरे मामले में मेरे पास एक लिंक की गई तालिका से एक जटिल दृश्य था, लिंक किए गए तालिका और स्थानीय तालिका के आधार पर 3 विचार। मैं पूरे अंदर आंतरिक जुड़ता था और यह समस्या प्रकट हुई थी। बाएं और दाएं बाहरी में जुड़ने को जोड़ना (उचित के रूप में) इस मुद्दे को हल करता है।

0

मैं एक ही समस्या हो गया और '=' ऑपरेटर

select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID < 0 

इसके बजाय का उपयोग कर की कोशिश की उपेक्षा करके यह संकल्प लिया।

धन्यवाद

0

एक और तरीका है काम करने के लिए चारों ओर समस्या एक Table Valued Function में ओरेकल डेटा वापस खींचने के लिए है। यह SQL सर्वर को बाहर जाने और ओरेकल से सभी डेटा पुनर्प्राप्त करने का कारण बन जाएगा और इसे परिणामी तालिका चर में फेंक देगा। सभी उद्देश्यों और उद्देश्यों के लिए, यदि आप क्वेरी में परिणामी तालिका मूल्यवान फ़ंक्शन का उपयोग करते हैं तो ओरेकल डेटा अब SQL सर्वर पर "स्थानीय" है।

मेरा मानना ​​है कि मूल समस्या यह है कि SQL सर्वर आपके यौगिक क्वेरी के निष्पादन को अनुकूलित करने का प्रयास कर रहा है जिसमें दूरस्थ ओरेकल क्वेरी परिणाम ऑनलाइन शामिल हैं। ओरेकल कॉल को लपेटने के लिए तालिका मूल्यवान फ़ंक्शन का उपयोग करके, SQL सर्वर फ़ंक्शन से लौटाए गए परिणामी तालिका चर पर यौगिक क्वेरी को अनुकूलित करेगा और दूरस्थ क्वेरी निष्पादन के नतीजे नहीं देगा।

CREATE function [dbo].[documents]() 
returns @results TABLE (

    DOCUMENT_ID INT NOT NULL, 
    TITLE VARCHAR(6) NOT NULL, 
    LEGALNAME VARCHAR(50) NOT NULL, 
    AUTHOR_ID INT NOT NULL, 
    DOCUMENT_TYPE VARCHAR(1) NOT NULL, 
    LAST_UPDATE DATETIME 
) AS 

BEGIN 
INSERT INTO @results 
SELECT  CAST(DOCUMENT_ID AS INT) AS DOCUMENT_ID, TITLE, LEGALNAME, CAST(AUTHOR_ID AS INT) AS AUTHOR_ID, DOCUMENT_TYPE, LAST_UPDATE 
FROM   OPENQUERY(ORACLE_SERVER, 
         'select DOCUMENT_ID, TITLE, LEGALNAME, AUTHOR_ID, DOCUMENT_TYPE, FUNDTYPE, LAST_UPDATE 
         from documents') 

return 
END 

फिर आप इसे के रूप में टेबल मूल्य समारोह का उपयोग कर सकते इसे अपने एसक्यूएल प्रश्नों में एक मेज थे:

SELECT * FROM DOCUMENTS()

1

आज मैं एक आंतरिक के साथ एक ही समस्या का सामना करना शामिल हों। को codechurn द्वारा सुझाए गए user1935511 द्वारा सुझाए गए Temporary Table का उपयोग करके cymorg द्वारा सुझाए गए Join Types को बदलने के लिए मेरे लिए कोई विकल्प नहीं है, मैं अपना समाधान साझा करना चाहता हूं।

मैंने क्वेरी ऑप्टिमाइज़र को सही दिशा में ड्राइव करने के लिए Join Hints का उपयोग किया, क्योंकि समस्या नेस्टेड लूप से स्थानीय स्तर पर दूरस्थ तालिका के साथ रणनीति में शामिल होने लगते हैं। मेरे लिए HASH, MERGE और रिमोट संकेतों में शामिल हों।

आपके लिए रिमोट एक विकल्प नहीं होगा क्योंकि इसका उपयोग केवल आंतरिक जुड़ने के संचालन के लिए किया जा सकता है। तो कुछ का उपयोग करना जैसे काम करना चाहिए।

select * 
from eopf.Batch b 
join eopf.BatchFile bf 
    on b.BatchID = bf.BatchID 
left outer merge join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
    on bf.ReferenceID = du.documentUploadID; 
संबंधित मुद्दे