sql >> Database >  >> RDS >> Sqlserver

Waarom krijg ik de foutmelding Xml-gegevenstype wordt niet ondersteund in gedistribueerde query's wanneer ik een gekoppelde server vraag naar niet-xml-gegevens?

Dit is een tekortkoming in SQL Server. Het loutere bestaan van een xml-kolom in de tabel voorkomt dat deze deelneemt aan gedistribueerde zoekopdrachten (bijv. bevraagd via een gekoppelde serververbinding). Dit staat vermeld in deze 'gepensioneerde' documentatie. In de documentatie van de huidige versie lijkt dit niet te worden vermeld.

Vroeger waren er relevante bugrapporten op Microsoft Connect, maar dat is nu 'met pensioen' ten gunste van de Azure-feedbackforums. Dit feedbackitem wordt afgesloten met een instructie om "feedback rechtstreeks vanuit de productdocumentatie in te dienen", wat prima zou zijn als de productdocumentatie dit daadwerkelijk zou vermelden. Dit andere feedbackitem bevat commentaar dat is gemigreerd vanuit Connect en heeft de status 'Niet gepland'.

Een van de Connect-bugrapporten die er waren, gaf twee tijdelijke oplossingen:

  1. Maak [een] weergave zonder de XML-kolom(men) op de externe server en bevraag die.

    In uw voorbeeld zou dit betekenen dat u een weergave toevoegt aan MyDatabase dat ziet er zo uit:

    CREATE VIEW V_T_B AS SELECT Id FROM T_B;
    

    U kunt deze weergave vervolgens opvragen via de link om de Id . te krijgen gegevens. Merk op dat zoiets als

    SELECT Id FROM ( SELECT Id FROM T_B ) T_B;
    

    niet werk.

  2. Gebruik een pass-through-query in het formulier

    SELECT * from OPENQUERY (... )
    

    Deze methode heeft het voordeel dat er geen wijziging in de brondatabase nodig is; het nadeel is dat het niet langer mogelijk is om standaard vierdelige naamgeving te gebruiken voor zowel lokale als gekoppelde gegevens. De vraag zou er als volgt uitzien:

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

    Merk op dat als je echt doe de xml-gegevens wilt, is deze methode (samen met het casten van en naar een niet-xml-gegevenstype) vereist :

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

Merk op dat de bug voor het eerst werd gemeld in SQL Server 2005, en nog steeds niet is opgelost in SQL Server 2017. Ik heb SQL Server 2019 nog niet kunnen controleren.



  1. Trigger maken om SQL te loggen die van invloed is op de tabel?

  2. SQL-ontwikkelaar start niet

  3. Converteer JS date time naar MySQL datetime

  4. Alle datums tussen twee datums weergeven