2013-01-21 5 views
43

Mam dwa serwery SQL (z uruchomionym programem SQL Server 2008) o nazwach DATA01 i DATA02. DATA02 ma połączoną definicję serwera LINK, która wskazuje na DATA01, z odpowiednią konfiguracją mapowania użytkownika. Na DATA01 tam jest baza MyDatabase zawierające te dwie tabele:Dlaczego pojawia się błąd "Typ danych Xml nie jest obsługiwany w zapytaniach rozproszonych" podczas wysyłania zapytania do połączonego serwera dla danych innych niż xml?

CREATE TABLE T_A (
    Id int 
) 

CREATE TABLE T_B (
    Id int, 
    Stuff xml 
) 

Kiedy uruchomić to polecenie z DATA02, mam dane zwracane zgodnie z oczekiwaniami:

SELECT Id FROM LINK.MyDatabase.dbo.T_A; 

Jednak, kiedy uruchomić to polecenie z DATA02 , pojawia się błąd:

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

błąd jest

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

i dziwnie to polecenie:

SELECT Id FROM LINK.MyDatabase.dbo.T_B; 

również daje ten sam błąd, chociaż nie SELECT jestem ing kolumnę xml! Co się dzieje?

Odpowiedz

72

Jest to niedobór w SQL Server. Samo istnienie istnienie kolumny xml na stole uniemożliwia mu udział w zapytaniach rozproszonych (np. Zapytaniu przez połączone połączenie z serwerem). Ten is mentioned in the documentation, choć niezbyt wyraźnie. Możesz zobaczyć main Connect bug report here i similar report here. Ten ostatni daje dwa obejścia:

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

    W przykładzie będzie to obejmować dodanie widoku do MyDatabase , który wygląda tak:

    CREATE VIEW V_T_B AS SELECT Id FROM T_B; 
    

    Następnie można zapytać tego widoku poprzez link aby uzyskać dane Id . Należy zauważyć, że coś takiego

    SELECT Id FROM (SELECT Id FROM T_B) T_B; 
    

    nie pracy.

  2. Use a pass-through query in the form

    SELECT * from OPENQUERY (...) 
    

    Metoda ta ma tę zaletę, że nie wymaga żadnych zmian w bazie danych źródłowego; wadą jest to, że nie jest już możliwe stosowanie standardowego czteroczęściowego nazewnictwa dla danych lokalnych i połączonych.Zapytanie wyglądałby

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

    Zauważ, że jeśli rzeczywiście zrobić chcą dane XML, metoda ta (wraz z odlewania do i od typu danych non-XML) będą wymagane:

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

Należy zauważyć, że błąd został po raz pierwszy opisana w SQL Server 2005, i pozostaje utrwalona w SQL Server 2014.

+4

Można również utworzyć procedurę składowaną w DATA02 i zdalnie wywoływać procedurę zapisaną w bazie, zamiast próbować uruchomić zapytanie zdalnie. –

+0

podczas tworzenia widoku na lokalnym DB, od wyboru identyfikatora zdalnej tabeli DB, otrzymuję ten sam błąd ... SQL SERVER 2008 R2 tutaj – RMiranda

+1

@RMiranda widok musi być utworzony na * zdalnym * DB, następnie z lokalnego DB powinieneś być w stanie zapytać o ten widok za pomocą linku. – AakashM

9

Spróbuj tego:

  • Tworzenie widoku z boku źródłowym XML oddanych do nvarchar (max):

Utwórz widok vXMLTest AS SELECT obsadą (Stuff jako nvarchar (max)) jak rzeczy z T_B

  • można ją wybrać na stronie docelowej z obsadą do xml

SELECT Obsada (Stuff jako XML) jako Stuff Z OPENQUERY (DATA02 'wybierz rzeczy z vXMLTest')

Rozwiązanie to działa na mnie w 2008R2.

+1

Doskonały pomysł! Działa świetnie. – NealWalters

Powiązane problemy