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

Comment réparer le message d'erreur 7325 dans SQL Server :"Les objets exposant des colonnes avec des types CLR ne sont pas autorisés dans les requêtes distribuées"

Si vous avez rencontré le message d'erreur 7325 dans SQL Server "Les objets exposant des colonnes avec des types CLR ne sont pas autorisés dans les requêtes distribuées", c'est probablement parce que vous essayez d'exécuter une requête distribuée sur une table qui contient une ou plusieurs colonnes avec des types CLR.

Par exemple, vous pouvez interroger une table qui utilise une géographie ou géométrie type de données dans une ou plusieurs de ses colonnes. Ces types de données sont implémentés en tant que types de données CLR (Common Language Runtime) .NET dans SQL Server. Et comme le dit le message d'erreur, "Les objets exposant des colonnes avec des types CLR ne sont pas autorisés dans les requêtes distribuées".

Heureusement, il existe une solution simple à ce problème. Et la réponse est fournie avec le message d'erreur complet.

Obtenir l'erreur

Voici un exemple de requête distribuée qui génère l'erreur 7325.

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

Résultat :

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"'.

Dans ce cas, j'ai exécuté une requête distribuée sur un serveur lié appelé "Homer". J'essayais d'interroger la table "Dimension.City" sur la base de données "WideWorldImportersDW", mais cela n'a pas fonctionné. Apparemment, la table contient un type CLR.

Le message d'erreur suggère que j'utilise plutôt une requête directe :

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

Correction de l'erreur – Requête directe

Je ne sais pas si cela est réellement classé comme "corriger" l'erreur ou simplement comme "contourner" l'erreur. Quoi qu'il en soit, le message d'erreur me dit d'utiliser une requête directe, c'est donc ce que je vais faire.

L'utilisation d'une requête directe nous permet d'exécuter des requêtes sur des tables distantes contenant des colonnes de types CLR.

Nous pourrions donc remplacer la requête précédente par la suivante :

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

Lorsque j'exécute cette requête, j'obtiens les résultats attendus sans erreur.

Le OPENQUERY() La fonction nous permet d'exécuter une requête directe sur le serveur lié spécifié. Le premier argument contient le nom du serveur lié et le deuxième argument est la requête que nous voulons exécuter (entre guillemets simples).

Vous pouvez donc copier la requête d'origine et la coller comme deuxième argument. Si vous faites cela, n'oubliez pas de supprimer le nom du serveur lié de la requête, sinon vous obtiendrez une autre erreur. Dans mon exemple, j'ai dû supprimer le "Homer" de Homer.WideWorldImportersDW.Dimension.City , de sorte qu'il est devenu WideWorldImportersDW.Dimension.City . C'est parce que nous fournissons déjà le nom du serveur lié dans le premier argument.

Trouver le coupable

Comme mentionné, le message d'erreur m'a dit que j'essayais d'interroger une colonne avec un type CLR. Je peux le vérifier en sautant sur le serveur distant (lié) et en exécutant le code suivant :

USE WideWorldImportersDW;
SELECT 
  COLUMN_NAME,
  DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'City'
  AND TABLE_SCHEMA = 'Dimension';

Résultat :

+----------------------------+-------------+
| 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         |
+----------------------------+-------------+

Nous pouvons voir que l' Emplacement la colonne a un type de données de geography , qui est un type CLR. Il s'agit de la cause la plus probable de l'erreur.