Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que recebo o erro O tipo de dados Xml não é suportado em consultas distribuídas ao consultar um servidor vinculado para dados não-xml?


Esta é uma deficiência no SQL Server. A mera existência de uma coluna xml na tabela impede que ela participe de consultas distribuídas (por exemplo, sendo consultada por meio de uma conexão de servidor vinculado). Isso é mencionado nesta documentação 'aposentada'. Não parece haver nenhuma menção a isso na documentação da versão atual.

Costumava haver relatórios de bugs relevantes no Microsoft Connect, mas agora foi 'aposentado' em favor dos fóruns de comentários do Azure. Este item de feedback é fechado com uma instrução para "Envie feedback diretamente da documentação do produto", o que seria bom se a documentação do produto realmente mencionasse isso. Este outro item de feedback inclui comentários migrados do Connect e tem o status 'Não planejado'.

Um dos relatórios de bugs do Connect que existiam forneceu duas soluções alternativas:

  1. Crie [a] view sem a(s) coluna(s) XML no servidor remoto e consulte isso.

    No seu exemplo, isso envolveria adicionar uma visualização a MyDatabase que se parece com isso:
    CREATE VIEW V_T_B AS SELECT Id FROM T_B;
    

    Você pode consultar essa visualização por meio do link para obter o Id dados. Observe que algo como
    SELECT Id FROM ( SELECT Id FROM T_B ) T_B;
    

    não trabalhar.

  2. Use uma consulta de passagem no formulário
    SELECT * from OPENQUERY (... )
    

    Esse método tem a vantagem de não exigir nenhuma alteração no banco de dados de origem; a desvantagem é que não é mais possível usar a nomenclatura padrão de quatro partes para dados locais e vinculados. A consulta ficaria como
     SELECT Id FROM OPENQUERY(DATA02, 'SELECT Id FROM T_B') T_B;
    

    Observe que se você realmente faz quiser os dados xml, este método (juntamente com a conversão de e para um tipo de dados não xml) será necessário :
     SELECT Id, CAST(Stuff AS XML) Stuff 
     FROM OPENQUERY(DATA02, 'SELECT Id, CAST(Stuff AS nvarchar(max)) Stuff 
                             FROM T_B') T_B;
    

Observe que o bug foi relatado pela primeira vez no SQL Server 2005 e permanece sem correção no SQL Server 2017. Ainda não consegui verificar o SQL Server 2019.