sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo corregir el mensaje de error 7325 en SQL Server:"Los objetos que exponen columnas con tipos CLR no están permitidos en consultas distribuidas"

Si ha encontrado el mensaje de error 7325 en SQL Server "Los objetos que exponen columnas con tipos CLR no están permitidos en consultas distribuidas", probablemente se deba a que está intentando ejecutar una consulta distribuida en una tabla que contiene una o más columnas con tipos CLR.

Por ejemplo, podría estar consultando una tabla que usa una geografía o geometría tipo de datos en una o más de sus columnas. Estos tipos de datos se implementan como tipos de datos de Common Language Runtime (CLR) de .NET en SQL Server. Y como dice el mensaje de error, "Los objetos que exponen columnas con tipos CLR no están permitidos en consultas distribuidas".

Afortunadamente, hay una solución fácil para este problema. Y la respuesta se proporciona con el mensaje de error completo.

Obtener el error

Este es un ejemplo de una consulta distribuida que genera el error 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"'.

En este caso, ejecuté una consulta distribuida en un servidor vinculado llamado "Homer". Intentaba consultar la tabla "Dimension.City" en la base de datos "WideWorldImportersDW", pero no funcionó. Aparentemente, la tabla contiene un tipo CLR.

El mensaje de error sugiere que use una consulta de transferencia en su lugar:

Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.

Corregir el error:consulta de transferencia

No estoy seguro de si esto se clasifica realmente como "arreglar" el error o simplemente como "solucionar" el error. De cualquier manera, el mensaje de error me dice que use una consulta de transferencia, así que eso es lo que haré.

El uso de una consulta de paso nos permite ejecutar consultas en tablas remotas que contienen columnas con tipos CLR.

Así que podríamos cambiar la consulta anterior por la siguiente:

SELECT TOP(10) *  
FROM OPENQUERY(
    Homer, 
    'SELECT * FROM WideWorldImportersDW.Dimension.City'
    );

Cuando ejecuto esa consulta, obtengo los resultados esperados sin errores.

El OPENQUERY() La función nos permite ejecutar una consulta de paso en el servidor vinculado especificado. El primer argumento contiene el nombre del servidor vinculado y el segundo argumento es la consulta que queremos ejecutar (entre comillas simples).

Entonces puede copiar la consulta original y pegarla como segundo argumento. Si hace esto, no olvide eliminar el nombre del servidor vinculado de la consulta, de lo contrario obtendrá otro error. En mi ejemplo, tuve que eliminar "Homer" de Homer.WideWorldImportersDW.Dimension.City , de modo que se convirtió en WideWorldImportersDW.Dimension.City . Esto se debe a que ya proporcionamos el nombre del servidor vinculado en el primer argumento.

Encontrar al culpable

Como se mencionó, el mensaje de error me dijo que estaba tratando de consultar una columna con un tipo CLR. Puedo verificar esto saltando al servidor remoto (enlazado) y ejecutando el siguiente 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 la Ubicación la columna tiene un tipo de datos de geografía , que es un tipo CLR. Esta es la causa más probable del error.