यदि आपको SQL सर्वर में त्रुटि संदेश 7325 का सामना करना पड़ा है "सीएलआर प्रकारों के साथ कॉलम को उजागर करने वाली वस्तुओं को वितरित प्रश्नों में अनुमति नहीं है" तो यह शायद इसलिए है क्योंकि आप एक तालिका के खिलाफ एक वितरित क्वेरी चलाने की कोशिश कर रहे हैं जिसमें सीएलआर प्रकारों के साथ एक या अधिक कॉलम हैं।
उदाहरण के लिए, हो सकता है कि आप किसी तालिका को क्वेरी कर रहे हों जो भूगोल . का उपयोग करती हो या ज्यामिति इसके एक या अधिक कॉलम में डेटा प्रकार। ये डेटा प्रकार SQL सर्वर में .NET सामान्य भाषा रनटाइम (CLR) डेटा प्रकारों के रूप में कार्यान्वित किए जाते हैं। और जैसा कि त्रुटि संदेश कहता है, "वितरित प्रश्नों में सीएलआर प्रकार वाले स्तंभों को उजागर करने वाली वस्तुओं की अनुमति नहीं है"।
सौभाग्य से, इस समस्या के लिए एक आसान समाधान है। और उत्तर पूर्ण त्रुटि संदेश के साथ प्रदान किया जाता है।
त्रुटि प्राप्त करना
यहां एक वितरित क्वेरी का उदाहरण दिया गया है जिसके परिणामस्वरूप त्रुटि 7325 होती है।
SELECT TOP(10) * FROM Homer.WideWorldImportersDW.Dimension.City;
परिणाम:
Msg 7325, Level 16, State 1, Line 1 Objects exposing columns with CLR types are not allowed in distributed queries. Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
इस मामले में मैंने "होमर" नामक एक लिंक किए गए सर्वर के खिलाफ एक वितरित क्वेरी चलाई। मैं "WideWorldImportersDW" डेटाबेस पर "Dimension.City" तालिका को क्वेरी करने का प्रयास कर रहा था, लेकिन यह काम नहीं किया। स्पष्ट रूप से तालिका में एक सीएलआर प्रकार होता है।
त्रुटि संदेश से पता चलता है कि मैं इसके बजाय पास-थ्रू क्वेरी का उपयोग करता हूं:
Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
त्रुटि को ठीक करना - पास-थ्रू क्वेरी
मुझे यकीन नहीं है कि यह वास्तव में त्रुटि को "ठीक करने" के रूप में वर्गीकृत किया गया है या बस "चारों ओर काम करना" त्रुटि के रूप में वर्गीकृत किया गया है। किसी भी तरह से, त्रुटि संदेश मुझे पास-थ्रू क्वेरी का उपयोग करने के लिए कहता है, इसलिए मैं यही करूँगा।
पास-थ्रू क्वेरी का उपयोग करने से हम दूरस्थ तालिकाओं के विरुद्ध क्वेरीज़ चला सकते हैं जिनमें CLR प्रकार वाले कॉलम होते हैं।
इसलिए हम पिछली क्वेरी को निम्नलिखित में बदल सकते हैं:
SELECT TOP(10) * FROM OPENQUERY( Homer, 'SELECT * FROM WideWorldImportersDW.Dimension.City' );
जब मैं उस क्वेरी को चलाता हूं, तो मुझे बिना किसी त्रुटि के अपेक्षित परिणाम मिलते हैं।
OPENQUERY()
फ़ंक्शन हमें निर्दिष्ट लिंक किए गए सर्वर पर पास-थ्रू क्वेरी चलाने की अनुमति देता है। पहले तर्क में लिंक किया गया सर्वर नाम होता है, और दूसरा तर्क वह क्वेरी है जिसे हम चलाना चाहते हैं (सिंगल कोट्स में संलग्न)।
तो आप मूल क्वेरी की प्रतिलिपि बना सकते हैं और इसे दूसरे तर्क के रूप में पेस्ट कर सकते हैं। यदि आप ऐसा करते हैं, तो लिंक किए गए सर्वर नाम को क्वेरी से हटाना न भूलें, अन्यथा आपको एक और त्रुटि मिलेगी। मेरे उदाहरण में, मुझे Homer.WideWorldImportersDW.Dimension.City
से "होमर" को हटाना पड़ा। , ताकि यह WideWorldImportersDW.Dimension.City
बन जाए . ऐसा इसलिए है क्योंकि हम पहले तर्क में पहले से ही लिंक किए गए सर्वर के नाम की आपूर्ति कर रहे हैं।
अपराधी का पता लगाना
जैसा कि बताया गया है, त्रुटि संदेश ने मुझे बताया कि मैं एक सीएलआर प्रकार वाले कॉलम से पूछताछ करने का प्रयास कर रहा था। मैं रिमोट (लिंक किए गए) सर्वर पर कूद कर और निम्नलिखित कोड चलाकर इसे सत्यापित कर सकता हूं:
USE WideWorldImportersDW; SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'City' AND TABLE_SCHEMA = 'Dimension';
परिणाम:
+----------------------------+-------------+ | COLUMN_NAME | DATA_TYPE | |----------------------------+-------------| | City Key | int | | WWI City ID | int | | City | nvarchar | | State Province | nvarchar | | Country | nvarchar | | Continent | nvarchar | | Sales Territory | nvarchar | | Region | nvarchar | | Subregion | nvarchar | | Location | geography | | Latest Recorded Population | bigint | | Valid From | datetime2 | | Valid To | datetime2 | | Lineage Key | int | +----------------------------+-------------+
हम देख सकते हैं कि स्थान कॉलम का डेटा प्रकार भूगोल . है , जो एक सीएलआर प्रकार है। यह त्रुटि का सबसे संभावित कारण है।