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

Como corrigir a mensagem de erro 7325 no SQL Server:“Objetos expondo colunas com tipos CLR não são permitidos em consultas distribuídas”


Se você encontrou a mensagem de erro 7325 no SQL Server “Objetos expondo colunas com tipos CLR não são permitidos em consultas distribuídas”, provavelmente é porque você está tentando executar uma consulta distribuída em uma tabela que contém uma ou mais colunas com tipos CLR.

Por exemplo, você pode estar consultando uma tabela que usa uma geografia ou geometria tipo de dados em uma ou mais de suas colunas. Esses tipos de dados são implementados como tipos de dados CLR (Common Language Runtime) do .NET no SQL Server. E como diz a mensagem de erro, “Objetos que expõem colunas com tipos CLR não são permitidos em consultas distribuídas”.

Felizmente, há uma solução fácil para esse problema. E a resposta é fornecida com a mensagem de erro completa.


Obtendo o erro


Aqui está um exemplo de uma consulta distribuída que resulta no erro 7325.
SELECT TOP(10) * 
FROM Homer.WideWorldImportersDW.Dimension.City;

Resultado:
Msg 7325, Level 16, State 1, Line 1
Objects exposing columns with CLR types are not allowed in distributed queries. Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.

Nesse caso, executei uma consulta distribuída em um servidor vinculado chamado “Homer”. Eu estava tentando consultar a tabela “Dimension.City” no banco de dados “WideWorldImportersDW”, mas não funcionou. Aparentemente, a tabela contém um tipo CLR.

A mensagem de erro sugere que eu use uma consulta de passagem:
Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.

Corrigindo o erro – Consulta de passagem


Não tenho certeza se isso é realmente classificado como “consertando” o erro ou simplesmente como “contornando” o erro. De qualquer forma, a mensagem de erro me diz para usar uma consulta de passagem, então é isso que farei.

O uso de uma consulta de passagem nos permite executar consultas em tabelas remotas que contêm colunas com tipos CLR.

Assim, poderíamos alterar a consulta anterior para o seguinte:
SELECT TOP(10) *  
FROM OPENQUERY(
    Homer, 
    'SELECT * FROM WideWorldImportersDW.Dimension.City'
    );

Quando executo essa consulta, obtenho os resultados esperados sem erros.

O OPENQUERY() A função nos permite executar uma consulta de passagem no servidor vinculado especificado. O primeiro argumento contém o nome do servidor vinculado e o segundo argumento é a consulta que queremos executar (entre aspas simples).

Assim, você pode copiar a consulta original e colá-la como segundo argumento. Se você fizer isso, não se esqueça de remover o nome do servidor vinculado da consulta, caso contrário, você receberá outro erro. No meu exemplo, tive que remover o “Homer” de Homer.WideWorldImportersDW.Dimension.City , para que se tornasse WideWorldImportersDW.Dimension.City . Isso ocorre porque já estamos fornecendo o nome do servidor vinculado no primeiro argumento.

Encontrando o culpado


Conforme mencionado, a mensagem de erro me disse que eu estava tentando consultar uma coluna com um tipo CLR. Posso verificar isso pulando para o servidor remoto (vinculado) e executando o seguinte código:
USE WideWorldImportersDW;
SELECT 
  COLUMN_NAME,
  DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'City'
  AND TABLE_SCHEMA = 'Dimension';

Resultado:
+----------------------------+-------------+
| COLUMN_NAME                | DATA_TYPE   |
|----------------------------+-------------|
| City Key                   | int         |
| WWI City ID                | int         |
| City                       | nvarchar    |
| State Province             | nvarchar    |
| Country                    | nvarchar    |
| Continent                  | nvarchar    |
| Sales Territory            | nvarchar    |
| Region                     | nvarchar    |
| Subregion                  | nvarchar    |
| Location                   | geography   |
| Latest Recorded Population | bigint      |
| Valid From                 | datetime2   |
| Valid To                   | datetime2   |
| Lineage Key                | int         |
+----------------------------+-------------+

Podemos ver que o Local coluna tem um tipo de dados de geografia , que é um tipo CLR. Esta é a causa mais provável do erro.