Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum erhalte ich den Fehler XML-Datentyp wird in verteilten Abfragen nicht unterstützt, wenn ich einen Verbindungsserver nach Nicht-XML-Daten abfrage?

Dies ist ein Mangel in SQL Server. Die bloße Existenz einer XML-Spalte in der Tabelle verhindert, dass sie an verteilten Abfragen teilnimmt (z. B. wenn sie über eine Verbindungsserververbindung abgefragt wird). Dies wird in dieser „ausrangierten“ Dokumentation erwähnt. In der Dokumentation der aktuellen Version scheint dies nicht erwähnt zu werden.

Früher gab es relevante Fehlerberichte zu Microsoft Connect, aber das wurde jetzt zugunsten der Azure-Feedback-Foren „aufgegeben“. Dieses Feedback-Element wird mit der Anweisung "Bitte senden Sie Feedback direkt aus der Produktdokumentation" geschlossen, was in Ordnung wäre, wenn dies in der Produktdokumentation tatsächlich erwähnt würde. Dieses andere Feedback-Element enthält aus Connect migrierte Kommentare und hat den Status „Ungeplant“.

Einer der Connect-Fehlerberichte, die früher existierten, gab zwei Problemumgehungen:

  1. Erstellen Sie [eine] Ansicht ohne die XML-Spalte(n) auf dem Remote-Server und fragen Sie diese ab.

    In Ihrem Beispiel würde dies das Hinzufügen einer Ansicht zu MyDatabase beinhalten das sieht so aus:

    CREATE VIEW V_T_B AS SELECT Id FROM T_B;
    

    Sie können diese Ansicht dann über den Link abfragen, um die Id zu erhalten Daten. Beachten Sie, dass etwas wie

    SELECT Id FROM ( SELECT Id FROM T_B ) T_B;
    

    nicht Arbeit.

  2. Verwenden Sie eine Pass-Through-Abfrage im Formular

    SELECT * from OPENQUERY (... )
    

    Diese Methode hat den Vorteil, dass keine Änderung an der Quelldatenbank erforderlich ist; Der Nachteil ist, dass es nicht mehr möglich ist, die standardmäßige vierteilige Benennung sowohl für lokale als auch für verknüpfte Daten zu verwenden. Die Abfrage würde so aussehen

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

    Beachten Sie, dass, wenn Sie es tatsächlich tun die XML-Daten möchten, ist diese Methode (zusammen mit dem Casting zu und von einem Nicht-XML-Datentyp) erforderlich :

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

Beachten Sie, dass der Fehler erstmals in SQL Server 2005 gemeldet wurde und in SQL Server 2017 nicht behoben wurde. Ich konnte SQL Server 2019 noch nicht überprüfen.