Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi est-ce que j'obtiens l'erreur Le type de données XML n'est pas pris en charge dans les requêtes distribuées lors de l'interrogation d'un serveur lié pour des données non XML ?

Il s'agit d'une lacune dans SQL Server. La simple existence d'une colonne xml sur la table l'empêche de participer à des requêtes distribuées (par exemple, être interrogé via une connexion à un serveur lié). Ceci est mentionné dans cette documentation « retirée ». Il ne semble pas en être fait mention dans la documentation de la version actuelle.

Auparavant, il y avait des rapports de bogues pertinents sur Microsoft Connect, mais ils ont maintenant été « retirés » au profit des forums de commentaires Azure. Cet élément de commentaires est fermé avec une instruction "Veuillez soumettre vos commentaires directement à partir de la documentation du produit", ce qui serait bien si la documentation du produit le mentionnait réellement. Cet autre élément de commentaire inclut des commentaires migrés depuis Connect et a le statut "Non planifié".

L'un des rapports de bogues Connect qui existaient auparavant proposait deux solutions de contournement :

  1. Créez [une] vue sans la ou les colonnes XML sur le serveur distant et interrogez-la.

    Dans votre exemple, cela impliquerait d'ajouter une vue à MyDatabase ça ressemble à ça :

    CREATE VIEW V_T_B AS SELECT Id FROM T_B;
    

    Vous pouvez ensuite interroger cette vue via le lien pour obtenir l'Id Les données. Notez que quelque chose comme

    SELECT Id FROM ( SELECT Id FROM T_B ) T_B;
    

    pas travail.

  2. Utiliser une requête directe dans le formulaire

    SELECT * from OPENQUERY (... )
    

    Cette méthode présente l'avantage de ne nécessiter aucune modification de la base de données source; l'inconvénient est qu'il n'est plus possible d'utiliser la dénomination standard en quatre parties pour les données locales et liées. La requête ressemblerait à

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

    Notez que si vous faites voulez les données xml, cette méthode (ainsi que la conversion vers et depuis un type de données non-xml) sera requise :

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

Notez que le bogue a été signalé pour la première fois dans SQL Server 2005 et reste non corrigé dans SQL Server 2017. Je n'ai pas encore pu vérifier SQL Server 2019.