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


21

मैं मूल सर्वर पर एक दृश्य के माध्यम से एक लिंक किए गए सर्वर से डेटा क्वेरी कर रहा हूं। दृश्य में मानकीकृत स्तंभों के एक जोड़े को शामिल करना है, जैसे कि Created, Modifiedऔर Deleted, लेकिन इस मामले में स्रोत सर्वर पर तालिका में कोई उपयुक्त जानकारी नहीं है। इसलिए कॉलम स्पष्ट रूप से अपने संबंधित प्रकारों में डाले जाते हैं। मैंने एक कॉलम बदलते हुए, दृश्य को अपडेट किया

NULL AS Modified

सेवा मेरे

CAST(NULL as DateTime) as Modified

हालाँकि, इस अद्यतन को करने के बाद, दृश्य निम्न त्रुटि संदेश को ट्रिगर कर रहा है:

Msg 7341, स्तर 16, राज्य 2, पंक्ति 3 स्तंभ की वर्तमान पंक्ति मान नहीं प्राप्त कर सकता है "(उपयोगकर्ता द्वारा उत्पन्न अभिव्यक्ति) .Ex100100" OLE DB प्रदाता "SQLNCLI11" से जुड़े सर्वर के लिए ""।

हमने यह "स्पष्ट कास्ट" किया है-आम तौर पर मूल सर्वर पर चिंता किए बिना, और मुझे संदेह है कि समस्या सर्वर के संस्करण से संबंधित हो सकती है। हमें वास्तव में इस कास्ट को लागू करने की आवश्यकता नहीं है , लेकिन यह क्लीनर लगता है। अभी मैं सिर्फ उत्सुक हूं कि ऐसा क्यों हो रहा है।

सर्वर संस्करण (मूल):

Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 मई 2014 18:34:29 कॉपीराइट (c) Microsoft NT एंटरप्राइज़ संस्करण (64-बिट) Windows NT 6.1 पर (बिल्ड 7601: सर्विस पैक 1) (हाइपरविजर)

सर्वर संस्करण (लिंक):

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) जून 17 2011 00:54:03 कॉपीराइट (c) Microsoft NT एंटरप्राइज़ संस्करण (64-बिट) Windows NT 6.1 पर (बिल्ड 7601: सर्विस पैक 1) (हाइपरवाइज़र )

संपादित करें
मुझे बस एहसास हुआ कि मैंने सभी कॉलमों को प्रश्न में नहीं पोस्ट करके गलती की है, और मुझे एक महत्वपूर्ण विवरण छोड़ने के लिए माफी मांगनी चाहिए। मुझे नहीं पता कि मैंने इसे कितनी जल्दी नोटिस किया। सवाल अभी भी बना हुआ है, हालांकि।

त्रुटिपूर्ण कलाकार कास्ट से डेटटाइम तक नहीं होता है, लेकिन एक कॉलम के साथ यूनीकआईडेंटिफायर में डाला जाता है।

यह अपराधी है:

CAST(NULL AS UniqueIdentifier) AS [GUID]

UniqueIdentifiers SQL Server 2008 R2 पर समर्थित हैं, और जैसा कि टिप्पणियों में उल्लेख किया गया है, दृश्य द्वारा निष्पादित क्वेरी लिंक किए गए सर्वर पर ठीक चलता है।


क्या आपके पास प्रत्येक सर्वर पर एक अलग ANSI NULL सेटिंग है? अलग टकराना?
Randolph West

दोनों सर्वरों में ANSI NULL = 0. मूल सर्वर का कोलाज है Danish_Norwegian_CI_ASऔर लिंक किए गए सर्वर में कोलाज है SQL_Danish_Pref_CP1_CI_AS, लेकिन COLLATEक्लॉज को DateTimeकॉलम पर लागू नहीं किया जा सकता है , इसलिए मुझे बहुत आगे नहीं मिला!
krystah

यदि यह select Null from ...नेस्टेड या नेस्टेड क्वेरी और CASTदूसरे में है तो क्या यह विफल होगा ?
स्टोलग

स्पष्ट कलाकारों के बिना इसे माना जाएगा क्योंकि INTआपने ऐसा करके डेटाटाइप को बदल दिया है। मुझे नहीं पता कि यह आपको वह त्रुटि संदेश क्यों देगा।
मार्टिन स्मिथ 10

मैंने पहले CTE में वास्तविक मूल्यों के साथ चयनित मानों को लपेटने की कोशिश की थी, फिर उनका चयन करें और बिना किसी भाग्य के CTE के कथन के बाद दिए गए NULL पर व्यवहार करें। मैंने आपके सुझाव की कोशिश की, NTE को CTE में रखते हुए और CTE को उद्धृत करते हुए स्टेटमेंट में डाली, लेकिन इससे भी वही त्रुटि होती है।
krystah

जवाबों:


13

इसलिए, मैं यह महसूस करने के बाद त्रुटि को पुन: उत्पन्न करने में सक्षम था कि CASTस्थानीय रूप से किया जा रहा है, दूरस्थ उदाहरण पर नहीं। मैंने पहले इसे ठीक करने की उम्मीद में SP3 तक जाने की सिफारिश की थी (आंशिक रूप से SP3 पर त्रुटि को पुन: पेश करने में सक्षम नहीं होने के कारण, और आंशिक रूप से इसकी परवाह किए बिना एक अच्छा विचार होने के कारण)। हालांकि, अब जब मैं त्रुटि को पुन: उत्पन्न कर सकता हूं, तो यह स्पष्ट है कि एसपी 3 तक बढ़ रहा है, जबकि अभी भी शायद एक अच्छा विचार है, इसे ठीक करने वाला नहीं है। और मैंने SQL Server 2008 R2 RTM और 2014 SP1 में त्रुटि (तीनों मामलों में "लूप-बैक" स्थानीय लिंक्ड सर्वर का उपयोग करके) भी पुन: उत्पन्न किया।

ऐसा लगता है कि इस समस्या के साथ क्या करना है जहां क्वेरी निष्पादित हो रही है, या कम से कम जहां इसका हिस्सा निष्पादित हो रहा है। मैं यह कहता हूं क्योंकि मैं CASTकाम करने के लिए ऑपरेशन करने में सक्षम था , लेकिन केवल एक स्थानीय डीबी ऑब्जेक्ट के संदर्भ को शामिल करके:

SELECT rmt.*, CAST(NULL AS UNIQUEIDENTIFIER) AS [GUID]
FROM [Local].[database_name].[dbo].[table_name] rmt
CROSS JOIN (SELECT TOP (1) 1 FROM [sys].[data_spaces]) tmp(dummy);

जो वास्तव में काम करता है। लेकिन मूल त्रुटि निम्नलिखित है:

SELECT rmt.*, CAST(NULL AS UNIQUEIDENTIFIER) AS [GUID]
FROM [Local].[database_name].[dbo].[table_name] rmt
CROSS JOIN (VALUES (1)) tmp(dummy);

मैं अनुमान लगा रहा हूं कि जब कोई स्थानीय संदर्भ नहीं होते हैं, तो पूरी क्वेरी को निष्पादित करने के लिए रिमोट सिस्टम पर भेज दिया जाता है, और किसी कारण से NULLइसे परिवर्तित नहीं किया जा सकता है UNIQUEIDENTIFIER, या शायद NULLOLE DB ड्राइवर द्वारा गलत तरीके से अनुवाद किया जा रहा है।


मेरे द्वारा किए गए परीक्षण के आधार पर, यह एक बग प्रतीत होगा, लेकिन मुझे यकीन नहीं है कि बग SQL सर्वर या SQL सर्वर मूल क्लाइंट / OLEDB ड्राइवर के भीतर है। हालांकि, रूपांतरण त्रुटि OLEDB चालक के भीतर होती है, और इसलिए जरूरी से परिवर्तित करने की कोई समस्या नहीं है INTकरने के लिए UNIQUEIDENTIFIERड्राइवर के बाद से (जिस रूपांतरण एसक्यूएल सर्वर में अनुमति नहीं है) एसक्यूएल सर्वर का उपयोग नहीं कर रहा है, रूपांतरण (एसक्यूएल सर्वर भी नहीं है ऐसा करने के लिए परिवर्तित INTकरने की अनुमति दें DATE, फिर भी OLEDB ड्राइवर को सफलतापूर्वक संभालता है, जैसा कि परीक्षणों में से एक में दिखाया गया है)।

मैंने तीन परीक्षण चलाए। सफल होने वाले दो लोगों के लिए, मैंने एक्सएमएल निष्पादन योजनाओं को देखा जो दूर से निष्पादित की जाने वाली क्वेरी को दिखाते हैं। तीनों के लिए, मैंने SQL Profiler के माध्यम से किसी भी अपवाद या OLEDB घटनाओं पर कब्जा कर लिया:

आयोजन:

  • त्रुटियां और चेतावनी
    • ध्यान
    • अपवाद
    • निष्पादन चेतावनी
    • उपयोगकर्ता त्रुटि संदेश
  • OLEDB
    • सब
  • TSQL
    • सभी को छोड़कर :
      • एसक्यूएल: StmtRecompile
      • XQuery स्टेटिक प्रकार

कॉलम फ़िल्टर:

  • आवेदन का नाम
    • नहीं पसंद % Intellisense%
  • SPID
    • 50 से अधिक या बराबर

जाँच

  • परीक्षण 1

    • CAST(NULL AS UNIQUEIDENTIFIER) यह काम करता है

    SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
                 , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
    FROM [Local].[TEMPTEST].[sys].[objects] rmt;

    XML निष्पादन योजना का प्रासंगिक भाग:

              <DefinedValue>
                <ColumnReference Column="Expr1002" />
                <ScalarOperator ScalarString="NULL">
                  <Const ConstValue="NULL" />
                </ScalarOperator>
              </DefinedValue>
      ...
    <RemoteQuery RemoteSource="Local" RemoteQuery=
     "SELECT 1 FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;"
     />
  • परीक्षण २

    • CAST(NULL AS UNIQUEIDENTIFIER) वह विफल रहता है

    SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
             --  , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
    FROM [Local].[TEMPTEST].[sys].[objects] rmt;

    (ध्यान दें: मैंने वहां उपशम रखा था, टिप्पणी की, ताकि जब मैं XML ट्रेस फ़ाइलों की तुलना में यह एक कम अंतर हो जाए)

  • परीक्षण ३

    • CAST(NULL AS DATE) यह काम करता है

    SELECT TOP (2) CAST(NULL AS DATE) AS [Something]
             --  , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
    FROM [Local].[TEMPTEST].[sys].[objects] rmt;

    (ध्यान दें: मैंने वहां उपशम रखा था, टिप्पणी की, ताकि जब मैं XML ट्रेस फ़ाइलों की तुलना में यह एक कम अंतर हो जाए)

    XML निष्पादन योजना का प्रासंगिक भाग:

              <DefinedValue>
                <ColumnReference Column="Expr1002" />
                <ScalarOperator ScalarString="[Expr1002]">
                  <Identifier>
                    <ColumnReference Column="Expr1002" />
                  </Identifier>
                </ScalarOperator>
              </DefinedValue>
     ...
    <RemoteQuery RemoteSource="Local" RemoteQuery=
     "SELECT TOP (2) NULL &quot;Expr1002&quot; FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;" 
     />

यदि आप टेस्ट # 3 को देखते हैं, तो यह SELECT TOP (2) NULL"रिमोट" सिस्टम पर कर रहा है। SQL Profiler ट्रेस दिखाता है कि इस दूरस्थ क्षेत्र का डेटाटाइप वास्तव में है INT। ट्रेस यह भी दर्शाता है कि ग्राहक की ओर का क्षेत्र (यानी जहां मैं क्वेरी चला रहा हूं) DATEअपेक्षा के अनुरूप है। से रूपांतरण INTकरने के लिए DATE, जो कुछ एसक्यूएल सर्वर में एक त्रुटि प्राप्त होगी, OLEDB चालक के भीतर बस ठीक काम करता है। दूरस्थ मान है NULL, इसलिए इसे सीधे लौटा दिया जाता है, इसलिए <ColumnReference Column="Expr1002" />

यदि आप टेस्ट # 1 को देखते हैं, तो यह SELECT 1"रिमोट" सिस्टम पर कर रहा है। SQL Profiler ट्रेस दिखाता है कि वास्तव में इस दूरस्थ क्षेत्र का डेटाटाइप है INT। ट्रेस यह भी दर्शाता है कि ग्राहक की ओर का क्षेत्र (अर्थात जहाँ से मैं क्वेरी चला रहा हूँ) GUIDअपेक्षित है। से रूपांतरण INTकरने के लिए GUID(याद रखें, इस ड्राइवर के भीतर किया जाता है, और OLEDB यह कॉल "GUID"), जो कुछ एसक्यूएल सर्वर में एक त्रुटि प्राप्त होगी, OLEDB चालक के भीतर बस ठीक काम करता है। दूरस्थ मूल्य नहीं है NULL , इसलिए इसे शाब्दिक रूप से बदल दिया जाता है NULL, इसलिए <Const ConstValue="NULL" />

टेस्ट # 2 विफल रहता है, इसलिए कोई निष्पादन योजना नहीं है। हालाँकि, यह "रिमोट" सिस्टम को सफलतापूर्वक क्वेरी करता है, लेकिन परिणाम सेट को वापस नहीं कर सकता। SQL Profiler ने जिस क्वेरी पर कब्जा किया है वह है:

SELECT TOP (2) NULL "Expr1002" FROM "TEMPTEST"."sys"."objects" "Tbl1001"

यह वही सटीक प्रश्न है जो टेस्ट # 1 में किया जा रहा है, फिर भी यहाँ यह विफल हो रहा है। अन्य मामूली अंतर हैं, लेकिन मैं OLEDB संचार की पूरी तरह से व्याख्या नहीं कर सकता। हालाँकि, दूरस्थ क्षेत्र अभी भी INT(wType = 3 = adInteger / four-byte हस्ताक्षरित पूर्णांक / DBTYPE_I4) के रूप में दिखा रहा है, जबकि "क्लाइंट" फ़ील्ड अभी भी GUID(wType = 72 = adGIDID / विश्वव्यापी विशिष्ट पहचानकर्ता / DBTYPE_GUID) के रूप में दिखाई दे रहा है। OLE DB प्रलेखन GUID डेटा प्रकार रूपांतरण , DBDATE डेटा प्रकार रूपांतरण , और I4 डेटा प्रकार रूपांतरण के रूप में ज्यादा मदद नहीं करता है कि I4 से या तो GUID या DBDATE में कनवर्ट करना असमर्थित है, फिर भी DATEक्वेरी काम करती है।

तीन परीक्षणों के लिए ट्रेस एक्सएमएल फाइलें पेस्टबिन पर स्थित हैं। यदि आप इस बात का विवरण देखना चाहते हैं कि प्रत्येक परीक्षण दूसरों से कहां भिन्न है, तो आप उन्हें स्थानीय रूप से सहेज सकते हैं और फिर उन पर "अंतर" कर सकते हैं। फाइलें हैं:

  1. NullGuidSuccess.xml
  2. NullGuidError.xml
  3. NullDateSuccess.xml

फलस्वरूप?

इसके बारे में क्या करना है? संभवतः सिर्फ काम-आस-पास मैंने शीर्ष खंड में उल्लेख किया है, यह देखते हुए कि एसक्यूएल नेटिव क्लाइंट - SQLNCLI11- को एसक्यूएल सर्वर २०१२ के रूप में दर्शाया गया है। एसक्यूएल सर्वर नेटिव क्लाइंट के विषय पर अधिकांश एमएसडीएन पृष्ठों में निम्नलिखित सूचना है। शीर्ष:

चेतावनी

SQL सर्वर 2012 से परे SQL सर्वर नेटिव क्लाइंट (SNAC) समर्थित नहीं है। नए विकास कार्यों में SNAC का उपयोग करने से बचें, और वर्तमान में इसका उपयोग करने वाले अनुप्रयोगों को संशोधित करने की योजना बनाएं। एसक्यूएल सर्वर के लिए Microsoft ODBC ड्राइवर Microsoft SQL सर्वर और Microsoft Azure एसक्यूएल डाटाबेस करने के लिए Windows से देशी कनेक्टिविटी प्रदान करता है।

अधिक जानकारी के लिए, कृपया देखें:


ODBC ??

मैंने एक ODBC लिंक किया हुआ सर्वर सेट किया है:

EXEC master.dbo.sp_addlinkedserver
  @server = N'LocalODBC',
  @srvproduct=N'{my_server_name}',
  @provider=N'MSDASQL',
  @provstr=N'Driver={SQL Server};Server=(local);Trusted_Connection=Yes;';

EXEC master.dbo.sp_addlinkedsrvlogin
  @rmtsrvname=N'LocalODBC',
  @useself=N'True',
  @locallogin=NULL,
  @rmtuser=NULL,
  @rmtpassword=NULL;

और फिर कोशिश की:

SELECT CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
FROM [LocalODBC].[tempdb].[sys].[objects] rmt;

और निम्न त्रुटि प्राप्त हुई:

OLE DB प्रदाता "MSDASQL" लिंक किए गए सर्वर "LocalODBC" के लिए संदेश "अनुरोधित रूपांतरण समर्थित नहीं है।"।
Msg 7341, स्तर 16, राज्य 2, पंक्ति 53
स्तंभ की वर्तमान पंक्ति मान नहीं प्राप्त कर सकते हैं "(उपयोगकर्ता द्वारा उत्पन्न अभिव्यक्ति) .Expr1002" OLE DB प्रदाता "MSDASQL" से लिंक किए गए सर्वर "LocalODBC" के लिए।


पुनश्च

जैसा कि यह दूरस्थ और स्थानीय सर्वरों के बीच GUID को परिवहन करने से संबंधित है, गैर-पूर्ण मानों को एक विशेष वाक्यविन्यास के माध्यम से नियंत्रित किया जाता है। जब मैंने भाग लिया तो मैंने SQL Profiler ट्रेस में निम्नलिखित OLE DB इवेंट जानकारी देखी CAST(0x00 AS UNIQUEIDENTIFIER):

<RemoteQuery RemoteSource="Local" RemoteQuery=
 "SELECT {guid'00000000-0000-0000-0000-000000000000'} &quot;Expr1002&quot; FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;" 
 />

पी पी एस

मैंने OPENQUERYनिम्नलिखित प्रश्न के माध्यम से भी परीक्षण किया :

SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
     --, (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
FROM   OPENQUERY([Local], N'SELECT 705 AS [dummy] FROM [TEMPTEST].[sys].[objects];') rmt;

और यह स्थानीय वस्तु संदर्भ के बिना भी सफल रहा। SQL Profiler ट्रेस XML फ़ाइल को PasteBin पर पोस्ट किया गया है:

NullGuidSuccessOPENQUERY.xml

एक्सएमएल निष्पादन योजना एक NULLस्थिर का उपयोग करके दिखाती है , जैसा कि टेस्ट # 1 में है।


मैंने 2012 sp3-cu1 पर इस मुद्दे को फिर से बनाया है।
बॉब क्लेम्स

@ याकूबकाइम्स दिलचस्प। क्या यह किसी लिंक किए गए सर्वर का उपयोग करके 2008 R2 उदाहरण या लूप-बैक है?
सोलोमन रटज़की

रिमोट लिंक्ड सर्वर 2008 R2 sp2 + MS15-058 (10.50.4339.0) है।
बॉब Klimes

1
संस्करण से संबंधित प्रतीत नहीं होता है। 2008r2,2012,2014,2016 के कई कॉम्ब्स का परीक्षण किया है और सभी ने अब तक त्रुटि उत्पन्न की है, यहां तक ​​कि 2008r2-2008r2 भी।
बॉब Klimes

2
क्या एक अत्यधिक अस्पष्ट मुद्दा है। अंतर्दृष्टि और शोध के लिए बहुत बहुत धन्यवाद, @srutzky, यह बहुत सराहना की है। मैं भविष्य के काम के लिए एसएनएसी की गिरावट को ध्यान में रखूंगा और उपर्युक्त वर्कअराउंड में वापसी करूंगा। अच्छा कार्य!
krystah

4

केवल एक बदसूरत वर्कअराउंड है - '1900-01-01'इसके बजाय कुछ डेट कंटीन्यू का उपयोग करें null

CAST('1900-01-01' as DateTime) as Modified

आयात करने के बाद आप 1900-01-01Null के साथ कॉलम अपडेट कर सकते हैं ।

यह यहाँ के अनुसार SQL 2012 सुविधा / बग की तरह है

संपादित करें:1900-00-00 मान्य दिनांक के साथ प्रतिस्थापित1900-01-01 नीचे @a_horse_with_no_name टिप्पणी के अनुसार।


यह वर्कअराउंड शायद ध्यान देने योग्य था, लेकिन यह अब प्रासंगिक नहीं हो सकता है कि ओपी ने स्पष्ट किया है कि समस्या का दोषी एक uniqueidentifierस्तंभ है। या शायद इसे अनुकूलित किया जा सकता है - कुछ ऐसा CAST('00000000-0000-0000-0000-000000000000' AS UniqueIdentifier) AS [GUID], शायद?
एंड्री एम

धन्यवाद दोस्तों। खाली GUID या डेटटाइम काम करने के लिए कास्टिंग करना, लेकिन मुझे यह समझने की आवश्यकता है कि ऐसा क्यों हो रहा है। यह भी ध्यान देने योग्य है कि मैं कुछ भी आयात नहीं कर रहा हूं, इसलिए स्रोत डेटा को बदलने की कोई संभावना नहीं है।
क्रिस्टा

1
1900-00-00अमान्य दिनांक है और स्वीकार नहीं किया जाएगा।
a_horse_with_no_name

@a_horse_with_no_name: बेवकूफ गलती, निश्चित।
एंटोन क्राउगलोव

2

समस्या डेटा प्रकार रूपांतरण (टिप्पणियों में हिट) से संबंधित है।

निम्नलिखित को धयान मे रखते हुए:

SELECT NULL as NullColumn INTO SomeTable;
EXEC sp_help SomeTable;
DROP TABLE SomeTable;

ध्यान दें कि NullColumnप्रकार का है int। SQL सर्वर intमानों को रूपांतरित करना पसंद नहीं करता है uniqueidentifier। यह SELECTकथन डेटा प्रकार रूपांतरण पर विफल हो जाएगा:

--Just a SELECT from nothing
SELECT CAST(CAST(NULL as int) as uniqueidentifier);
--
--or to see it from a physical table:
SELECT NULL as NullColumn INTO SomeTable;
SELECT CAST(NullColumn as uniqueidentifier) FROM SomeTable;
DROP TABLE SomeTable;

एमएसजी 529, लेवल 16, स्टेट 2, लाइन 3

डेटा प्रकार इंट से अद्वितीय पहचानकर्ता के लिए स्पष्ट रूपांतरण की अनुमति नहीं है।

हालांकि यह विशिष्ट मान (NULL) एक GUID में डाला जा सकता है, SQL सर्वर विशिष्ट मानों को देखने से पहले डेटा प्रकार रूपांतरण के आधार पर त्रुटि को फेंकता है। इसके बजाय, आपको एक डेटाटाइप CASTके निहितार्थ intको बदलने के लिए एक मल्टी-स्टेप ऑपरेशन करने की आवश्यकता होगी, जिसे साफ-साफ रूप में परिवर्तित किया जा सकता है uniqueidentifer- जिसका अर्थ है कि पहले कास्टिंग varcharकरना uniqueidentifier:

--Just a SELECT from nothing
SELECT CAST(CAST(CAST(NULL as int) as varchar) as uniqueidentifier);
--
--or to see it from a physical table:
SELECT NULL as NullColumn INTO SomeTable;
SELECT CAST(CAST(NullColumn as varchar(32)) as uniqueidentifier) FROM SomeTable;
DROP TABLE SomeTable;

यह समस्या वास्तव में डेटाटाइप रूपांतरणों के कारण नहीं है, कम से कम SQL सर्वर के भीतर नहीं है। विवरण मेरे उत्तर में हैं , लेकिन रूपांतरण SQL सर्वर के भीतर नहीं बल्कि OLEDB ड्राइवर के भीतर किया जा रहा है, और रूपांतरण नियम समान नहीं हैं।
सोलोमन रटज़की

1

ओपी अंततः तय कर सकता है कि क्या यह एक उचित जवाब है।

मेरे पास कोई 'पूर्ण' प्रमाण नहीं है, लेकिन मुझे इस बात पर संदेह है कि समस्या इस तथ्य से उपजी है कि एक UniqueIdentifer सर्वर पर निर्भर है और शायद प्रदाता को यह पता लगाने में कठिनाई हो रही है कि कौन सा सर्वर (स्थानीय या दूरस्थ) इस अद्वितीय पहचानकर्ता से प्राप्त कर सकता है, यहां तक ​​कि शून्य। इसलिए आप शायद इस परिदृश्य में किसी अन्य डेटाटाइप को सफलतापूर्वक डाल सकते हैं, लेकिन अद्वितीय पहचानकर्ता को नहीं। डेटा प्रकार जो 'सर्वर' पर निर्भर हैं जैसे UNIQUEIDENTIFIERS और DATETIMEOFFSET आपको वह त्रुटि देगा, जिसका आप सामना कर रहे हैं।

4-भाग के नाम कार्यों के बजाय OPENQUERY का उपयोग करना।

set nocount on  
DECLARE @cmd nVARCHAR(max)
DECLARE @datatype SYSNAME

DECLARE _CURSOR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT NAME
FROM sys.types 

OPEN _CURSOR

FETCH NEXT
FROM _CURSOR
INTO @datatype

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        SET @cmd = 'select top 1 cast(null as ' + @Datatype + ') as CastedData from remoteserver.remotedatabase.remoteschema.remotetable'
        PRINT @cmd
        EXECUTE sp_executesql @cmd
    END TRY

    BEGIN CATCH
        PRINT Error_message()
    END CATCH

FETCH NEXT
FROM _CURSOR
INTO @datatype
END --End While

CLOSE _CURSOR

DEALLOCATE _CURSOR

आपके द्वारा वास्तव में क्या मतलब है Uniqueidentifierऔर DateTimeOffsetसर्वर पर निर्भर किया जा रहा है? क्या आपके पास इसके लिए कोई स्रोत है?
krystah

@krystah - इस लिंक से ( Technet.microsoft.com/en-us/library/ms190215(v=sql.105).aspx ) "अनूठे पहचानकर्ता डेटा प्रकार 16-बाइट बाइनरी मानों को संग्रहीत करता है जो विश्व स्तर पर अद्वितीय पहचानकर्ताओं (GUID) से संचालित होते हैं। । GUID एक अद्वितीय बाइनरी नंबर है, दुनिया में कोई भी अन्य कंप्यूटर उस GUID के मूल्य का एक डुप्लिकेट उत्पन्न नहीं करेगा। GUID के लिए मुख्य उपयोग एक पहचानकर्ता को निर्दिष्ट करने के लिए है जो एक नेटवर्क में अद्वितीय होना चाहिए जिसमें कई साइटों पर कई कंप्यूटर हैं। "
स्कॉट हॉजिन

DateTimeOffSet के लिए ( msdn.microsoft.com/en-us/library/bb630289.aspx ) एक ऐसी तारीख को परिभाषित करता है, जो एक दिन के समय के साथ संयुक्त होती है जिसमें समय क्षेत्र की जागरूकता होती है और यह 24 घंटे की घड़ी पर आधारित होती है
स्कॉट होजीन

मैं 'इनफ़ायरिंग' हूं, क्योंकि ये दो डेटा प्रकार 'लगते हैं' केवल वही होते हैं जो आपके परिदृश्य में त्रुटि देते हैं और वे डेटा प्रकार 'सर्वर-निर्भर' होते हैं, यही आपकी समस्या का कारण है। यदि आप अपने दृष्टिकोण से अपने परिणामों को प्राप्त करने और अतिरिक्त अशक्त
जातियों को

@krystah और स्कॉट: ये दो डेटाटाइप्स सर्वर-निर्भर नहीं हैं, कम से कम आप कैसे वर्णन कर रहे हैं और लागू नहीं कर रहे हैं। GUIDs उनके अंतर्निहित बाइनरी प्रतिनिधित्व ( विवरण के लिए यहां देखें) के संदर्भ में "आर्किटेक्चर" पर निर्भर हैं , लेकिन अगर यह एक मुद्दा था, तो कोई भी GUID ठीक से स्थानांतरित नहीं होगा। DATETIMEOFFSET के लिए, जो केवल एक ऑफसेट के बारे में जानता है, वास्तविक समय क्षेत्र / TimeZoneID का नहीं। हालांकि दोनों नए मूल्यों को उत्पन्न करने के लिए सिस्टम जानकारी का उपयोग करते हैं, यहां कोई नया मान उत्पन्न नहीं किया जा रहा है, और यदि वे थे, तो वे प्रदाता में उत्पन्न नहीं होंगे।
सोलोमन रटज़की 17

0

समाधान: स्वीकृत उत्तर से प्रतीत होता है कि रूपांतरण स्थानीय रूप से होने की आवश्यकता है क्योंकि OLEDB ड्राइवर इसका समर्थन नहीं करता है।

इसलिए मुझे लगता है कि एक साधारण वर्कअराउंड (कम से कम मेरी क्वेरी के मामले में जो uniqueidentifierएक पुनरावर्ती CTE के आधार मामले में एक अशक्त का चयन कर रहा है ) को अशक्त चर घोषित करना है:

declare @nullGuid as uniqueidentifier = null;

--Instead of...
CAST(NULL AS UniqueIdentifier) AS [GUID]

--use
@nullGuid AS [GUID]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.