2011-03-11 15 views
18

मेरे पास एक SQL सर्वर उदाहरण है कि मैंने एक लिंक किए गए सर्वर को किसी अन्य SQL इंस्टेंस में जोड़ा है। जिस तालिका में मैं लिंक किए गए सर्वर पर पहुंच रहा हूं, इसमें स्थानिक प्रकार हैं। मैं एक त्रुटि प्राप्त जब मैं तालिका क्वेरी करने के लिए प्रयास करें:एसक्यूएल सर्वर स्थानिक और लिंक किए गए सर्वर

A severe error occurred on the current command. The results, if any, should be discarded.

वहाँ तालिकाओं कि स्थानिक प्रकार हो क्वेरी करने के लिए कोई तरीका है:

Objects exposing columns with CLR types are not allowed in distributed queries. Please use a pass-through query to access remote object.

अगर मैं एक ही क्वेरी के साथ OPENQUERY का उपयोग मैं एक त्रुटि मिलती है लिंक किए गए सर्वर के माध्यम से?

उत्तर

14

एक तरीका यह चारों ओर काम करने के लिए NVARCHAR (मैक्स) के रूप में स्थानिक डेटा पारित करने के लिए है

select go=geometry::STGeomFromText(go,0) 
from openquery([other\instance], 
'select go=convert(nvarchar(max),go) from tempdb.dbo.geom') 

ध्यान दें: go एक स्तंभ नाम, ज्यामिति-वस्तु

या बजाय समारोह का उपयोग कर के लिए कम है स्पष्ट कास्ट

select go=geometry::STGeomFromText(go,0) 
from openquery([other\instance], 
'select go=go.STAsText() from tempdb.dbo.geom') 
+0

, उपयोग: भूगोल :: STGeomFromText (जाना, 4326) –

4

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

11

मैं एक ही समस्या में आया, लेकिन स्वीकार्य समाधान मेरे मामले में एक विकल्प नहीं था, कई अनुप्रयोगों के कारण जो पूरी तरह से अलग क्वेरी की अपेक्षा नहीं कर सके।

इसके बजाय, मुझे लगता है कि मुझे सिस्टम को धोखा देने का एक तरीका मिला है। स्थानीय सर्वर रन पर:

CREATE VIEW stage_table 
AS 
SELECT * 
FROM OPENQUERY([REMOTESERVER],'SELECT * FROM [REMOTEDB].[SCHEMA].TARGET_TABLE'); 
GO 
CREATE SYNONYM TARGET_TABLE FOR stage_table; 
GO 

देखा, अब आप बस

SELECT * FROM TARGET_TABLE; 

उपयोग कर सकते हैं कौन सा है अपने अनुप्रयोगों शायद क्या उम्मीद करते हैं। SQLEXPRESS 2008 R2, और रिमोट सर्वर एसक्यूएल एक्सप्रेस 2014

भूगोल के लिए
+0

मैं 'वस्तुओं CLR प्रकार के साथ स्तंभों को उजागर का सामना करना पड़ा

स्थानीय सर्वर के साथ उपरोक्त परिदृश्य की कोशिश की वितरित प्रश्नों में अनुमति नहीं है। कृपया दूरस्थ ऑब्जेक्ट तक पहुंचने के लिए पास-थ्रू क्वेरी का उपयोग करें ': pkExec से संकेत इस समस्या को हल करता है। – AAsk

+2

बस स्पष्ट हो जाओ। आवश्यक सटीक परिवर्तन निम्नानुसार है। यदि [remoteservername] से फ़ॉर्म का चयन करें। [Remotedatabasename]। [Schemaname]। [Tablename] 'विफल हो रहा है, फिर इसे OPENQUERY ([remoteservername] से 'select * के साथ प्रतिस्थापित करें,' चुनें * से [remotedatabasename ]। [schemaname]। [tablename] ') '। आपको मूल रूप से रिमोट सर्वर नाम (यानी इसका डोमेन नाम या ऐसा कुछ भी नहीं है ... लेकिन मनमानी नाम जिसे आपने इसे लिंक किया है) तालिका पहचानकर्ता के बाहर और इसे ओपनक्वायरी के पैरामीटर के रूप में पास करना होगा। – Triynko

+0

@Triynko मेरा उत्तर उस मामले को भी कवर करता है जहां क्वेरी का रूप "table_name से चुनें" है। यदि आप अपनी टिप्पणी में जो उल्लेख करते हैं उसका उपयोग करते हैं, तो स्थानिक डेटाटाइप के लिए क्वेरी विफल हो जाएगी (एएस्क की टिप्पणी के अनुसार)। – pkExec

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