Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come correggere il messaggio di errore 7325 in SQL Server:"Gli oggetti che espongono colonne con tipi CLR non sono consentiti nelle query distribuite"

Se hai riscontrato il messaggio di errore 7325 in SQL Server "Gli oggetti che espongono colonne con tipi CLR non sono consentiti nelle query distribuite" è probabilmente perché stai tentando di eseguire una query distribuita su una tabella che contiene una o più colonne con tipi CLR.

Ad esempio, potresti eseguire query su una tabella che utilizza una geografia o geometria tipo di dati in una o più delle sue colonne. Questi tipi di dati sono implementati come tipi di dati CLR (Common Language Runtime) .NET in SQL Server. E come dice il messaggio di errore, "Gli oggetti che espongono colonne con tipi CLR non sono consentiti nelle query distribuite".

Fortunatamente, c'è una soluzione semplice per questo problema. E la risposta viene fornita con il messaggio di errore completo.

Ricevere l'errore

Ecco un esempio di una query distribuita che genera l'errore 7325.

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

Risultato:

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

In questo caso ho eseguito una query distribuita su un server collegato chiamato "Homer". Stavo cercando di interrogare la tabella "Dimension.City" nel database "WideWorldImportersDW", ma non ha funzionato. Apparentemente la tabella contiene un tipo CLR.

Il messaggio di errore suggerisce invece di utilizzare una query pass-through:

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

Correzione dell'errore - Query pass-through

Non sono sicuro se questo sia effettivamente classificato come "correzione" dell'errore o semplicemente come "aggiramento" all'errore. Ad ogni modo, il messaggio di errore mi dice di utilizzare una query pass-through, quindi è quello che farò.

L'utilizzo di una query pass-through ci consente di eseguire query su tabelle remote che contengono colonne con tipi CLR.

Quindi potremmo cambiare la query precedente nella seguente:

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

Quando eseguo quella query, ottengo i risultati previsti senza errori.

Il OPENQUERY() La funzione ci consente di eseguire una query pass-through sul server collegato specificato. Il primo argomento contiene il nome del server collegato e il secondo argomento è la query che vogliamo eseguire (racchiusa tra virgolette singole).

Quindi puoi copiare la query originale e incollarla come secondo argomento. Se lo fai, non dimenticare di rimuovere il nome del server collegato dalla query, altrimenti riceverai un altro errore. Nel mio esempio, ho dovuto rimuovere "Homer" da Homer.WideWorldImportersDW.Dimension.City , così da diventare WideWorldImportersDW.Dimension.City . Questo perché stiamo già fornendo il nome del server collegato nel primo argomento.

Trovare il colpevole

Come accennato, il messaggio di errore mi diceva che stavo cercando di interrogare una colonna con un tipo CLR. Posso verificarlo saltando sul server remoto (collegato) ed eseguendo il seguente codice:

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

Risultato:

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

Possiamo vedere che la Posizione la colonna ha un tipo di dati di area geografica , che è un tipo CLR. Questa è la causa più probabile dell'errore.