To jest niedoskonałość SQL Server. Samo istnienie kolumny xml w tabeli uniemożliwia jej uczestniczenie w zapytaniach rozproszonych (np. wysyłanie zapytań przez połączenie z serwerem połączonym). Jest to wspomniane w tej „wycofanej” dokumentacji. Wydaje się, że nie ma o tym żadnej wzmianki w dokumentacji aktualnej wersji.
Kiedyś istniały odpowiednie raporty o błędach w Microsoft Connect, ale teraz zostały one „wycofane” na rzecz forów opinii dotyczących platformy Azure. Ten element opinii jest zamknięty z instrukcją „Prześlij opinię bezpośrednio z dokumentacji produktu”, co byłoby w porządku, gdyby dokumentacja produktu rzeczywiście o tym wspominała. Ten inny element opinii zawiera komentarz przeniesiony z Connect i ma status „Nieplanowane”.
Jeden z dotychczasowych raportów o błędach w usłudze Connect zawierał dwa obejścia:
Utwórz [a] widok bez kolumn(y) XML na zdalnym serwerze i wykonaj zapytanie.
W twoim przykładzie wymagałoby to dodania widoku do
MyDatabase
to wygląda tak:CREATE VIEW V_T_B AS SELECT Id FROM T_B;
Następnie możesz wysłać zapytanie do tego widoku za pomocą linku, aby uzyskać
Id
dane. Zauważ, że coś takiego jakSELECT Id FROM ( SELECT Id FROM T_B ) T_B;
nie praca.
Użyj zapytania przekazującego w formularzu
SELECT * from OPENQUERY (... )
Ta metoda ma tę zaletę, że nie wymaga żadnych zmian w źródłowej bazie danych; Minusem jest to, że nie jest już możliwe używanie standardowego czteroczęściowego nazewnictwa zarówno dla danych lokalnych, jak i połączonych. Zapytanie wyglądałoby jak
SELECT Id FROM OPENQUERY(DATA02, 'SELECT Id FROM T_B') T_B;
Zwróć uwagę, że jeśli faktycznie robisz chcesz danych xml, ta metoda (wraz z rzutowaniem do i z typu danych innego niż XML) będzie wymagana :
SELECT Id, CAST(Stuff AS XML) Stuff FROM OPENQUERY(DATA02, 'SELECT Id, CAST(Stuff AS nvarchar(max)) Stuff FROM T_B') T_B;
Zauważ, że błąd został po raz pierwszy zgłoszony w SQL Server 2005 i pozostaje nienaprawiony w SQL Server 2017. Nie mogłem jeszcze sprawdzić SQL Server 2019.