2013-01-21 32 views
43

मेरे पास दो SQL सर्वर (SQL Server 2008 चल रहा है) नाम DATA01 और DATA02 है। DATA02 में एक लिंक की गई सर्वर परिभाषा LINK है, जो DATA01 पर इंगित करती है, उपयुक्त उपयोगकर्ता मानचित्रण सेट अप के साथ। ,गैर-एक्सएमएल डेटा के लिए एक लिंक किए गए सर्वर से पूछताछ करते समय मुझे "एक्सएमएल डेटा प्रकार वितरित प्रश्नों में समर्थित नहीं है" त्रुटि क्यों मिलती है?

SELECT Id FROM LINK.MyDatabase.dbo.T_A; 

हालांकि जब मैं DATA02 से इस कमांड चलाएँ:

CREATE TABLE T_A (
    Id int 
) 

CREATE TABLE T_B (
    Id int, 
    Stuff xml 
) 

जब मैं DATA02 से इस आदेश को चलाने के लिए, मैं डेटा नहीं दिया अपेक्षा के अनुरूप मिल: DATA01 पर एक डेटाबेस MyDatabase इन दो तालिकाओं युक्त होती है

SELECT Id, Stuff FROM LINK.MyDatabase.dbo.T_B; 

त्रुटि

०१२३५१६४१० है:, मैं कोई त्रुटि मिलती है

Xml data type is not supported in distributed queries. Remote object 'DATA02.MyDatabase.dbo.T_B' has xml column(s).

और अजीब, इस आदेश:

SELECT Id FROM LINK.MyDatabase.dbo.T_B; 

भी एक ही त्रुटि देता है, भले ही मैं xml स्तंभ नहीं SELECT ing कर रहा हूँ! क्या चल रहा है?

उत्तर

72

यह SQL सर्वर के भीतर एक कमी है। तालिका पर xml कॉलम के अस्तित्व इसे वितरित प्रश्नों में भाग लेने से रोकता है (उदाहरण के लिए एक लिंक किए गए सर्वर कनेक्शन के माध्यम से पूछताछ की जा रही है)। यह is mentioned in the documentation, हालांकि विशेष रूप से प्रमुख रूप से नहीं। आप main Connect bug report here और similar report here देख सकते हैं।

  1. Create [a] view without the XML column(s) on remote server and query that.

    अपने उदाहरण में, यह MyDatabase कि इस तरह दिखता है के लिए एक दृश्य जोड़ने शामिल होगा: बाद के दो समाधान देता है

    CREATE VIEW V_T_B AS SELECT Id FROM T_B; 
    

    फिर आप लिंक के माध्यम से इस दृश्य को क्वेरी सकता है Id डेटा प्राप्त करने के लिए। नोट

    की तरह है कि कुछ
    SELECT Id FROM (SELECT Id FROM T_B) T_B; 
    

    काम नहीं करता है।

  2. Use a pass-through query in the form

    SELECT * from OPENQUERY (...) 
    

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

    SELECT Id FROM OPENQUERY(DATA02, 'SELECT Id FROM T_B') T_B; 
    

    ध्यान दें कि अगर आप वास्तव में एक्सएमएल डेटा चाहते हैं, इस विधि ( साथ करने के लिए और एक गैर एक्सएमएल डेटाप्रकार से कास्टिंग के साथ) कर लगेगा हो जाएगा आवश्यक:

    SELECT Id, CAST(Stuff AS XML) Stuff 
    FROM OPENQUERY(DATA02, 'SELECT Id, CAST(Stuff AS nvarchar(max)) Stuff 
             FROM T_B') T_B; 
    

ध्यान दें कि बग पहले SQL सर्वर 2005 में सूचना मिली थी, और SQL सर्वर में अनिर्धारित रहता 2014

+4

आप डेटाए 2 पर संग्रहीत प्रक्रिया भी बना सकते हैं और दूरस्थ रूप से क्वेरी को चलाने की कोशिश करने के बजाय संग्रहीत प्रक्रिया को दूरस्थ रूप से कॉल कर सकते हैं। –

+0

जब मैं दूरस्थ डीबी तालिका के चयन आईडी से स्थानीय डीबी पर दृश्य बनाता हूं, तो मुझे एक ही त्रुटि मिलती है ... SQL सर्वर 2008 आर 2 यहां – RMiranda

+1

@RMiranda दृश्य * रिमोट * डीबी पर बनाया जाना है, फिर स्थानीय डीबी से आप लिंक के माध्यम से उस दृश्य को पूछने में सक्षम होना चाहिए। – AakashM

9

इस प्रयास करें:

  • nvarchar को (अधिकतम) एक्सएमएल कलाकारों के साथ स्रोत की ओर एक दृश्य बनाएँ:

बनाएँ देखें vXMLTest के रूप में चयन डाली (सामग्री के रूप में nvarchar (अधिकतम)) T_B

से
  • STUFF के रूप में आप एक्सएमएल के लिए कलाकारों के साथ गंतव्य की ओर उसका चयन कर सकते

चयन कास्ट (XML के रूप में सामग्री) सामग्री OPENQUERY से के रूप में (DATA02, 'का चयन vXMLTest से सामग्री')

यह समाधान 2008R2 में मेरे लिए काम करता है।

+1

उत्कृष्ट विचार! बहुत अच्छा काम करता है। – NealWalters