sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor får jeg fejlen Xml-datatype understøttes ikke i distribuerede forespørgsler, når jeg forespørger på en forbundet server for ikke-xml-data?

Dette er en mangel i SQL Server. Den blotte eksistens af en xml-kolonne på bordet forhindrer den i at deltage i distribuerede forespørgsler (f.eks. at blive forespurgt via en forbundet serverforbindelse). Dette er nævnt i denne 'pensionerede' dokumentation. Der ser ikke ud til at være nogen omtale af dette i den aktuelle versions dokumentation.

Der plejede at være relevante fejlrapporter på Microsoft Connect, men det er nu blevet 'pensioneret' til fordel for Azures feedbackfora. Denne feedback-vare er lukket med en instruktion om "Send venligst feedback direkte fra produktdokumentationen", hvilket ville være fint, hvis produktdokumentationen faktisk nævnte dette. Dette andet feedbackelement inkluderer kommentarer, der er migreret fra Connect, og har status 'Uplanlagt'.

En af de Connect-fejlrapporter, der plejede at eksistere, gav to løsninger:

  1. Opret [en] visning uden XML-kolonnen(r) på fjernserveren, og forespørg på det.

    I dit eksempel ville dette involvere tilføjelse af en visning til MyDatabase der ser sådan ud:

    CREATE VIEW V_T_B AS SELECT Id FROM T_B;
    

    Du kan derefter forespørge på denne visning via linket for at få Id data. Bemærk, at noget lignende

    SELECT Id FROM ( SELECT Id FROM T_B ) T_B;
    

    ikke arbejde.

  2. Brug en pass-through-forespørgsel i formularen

    SELECT * from OPENQUERY (... )
    

    Denne metode har den fordel, at den ikke kræver nogen ændring af kildedatabasen; Ulempen er, at det ikke længere er muligt at bruge standard firedelt navngivning for både lokale og linkede data. Forespørgslen ville se ud

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

    Bemærk, at hvis du faktisk gør ønsker xml-dataene, vil denne metode (sammen med casting til og fra en ikke-xml-datatype) være påkrævet :

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

Bemærk, at fejlen først blev rapporteret i SQL Server 2005 og forbliver urettet i SQL Server 2017. Jeg har endnu ikke været i stand til at tjekke SQL Server 2019.



  1. Intermitterende ODBC-forbindelsesfejl

  2. SQLiteDiskIOException med fejlkode 10:disk I/O fejl

  3. Få opdateret række

  4. Sådan opretter du indeks i MySQL