Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego otrzymuję błąd, że typ danych XML nie jest obsługiwany w zapytaniach rozproszonych podczas wysyłania zapytań do serwera połączonego o dane inne niż XML?

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:

  1. 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 jak

    SELECT Id FROM ( SELECT Id FROM T_B ) T_B;
    

    nie praca.

  2. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zresetować wartość kolumny tożsamości w tabeli SQL Server — samouczek SQL Server / T-SQL, część 43

  2. wyświetlanie wielu rekordów za pomocą zestawu wyników

  3. WHERE IN (tablica identyfikatorów)

  4. SQL - Jak przechowywać i nawigować w hierarchiach?

  5. Wdróż zawsze włączone grupy dostępności programu SQL Server w systemie Linux