Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak naprawić komunikat o błędzie 7325 w programie SQL Server:„Obiekty eksponujące kolumny z typami CLR nie są dozwolone w kwerendach rozproszonych”

Jeśli napotkałeś komunikat o błędzie 7325 w SQL Server „Obiekty eksponujące kolumny z typami CLR nie są dozwolone w zapytaniach rozproszonych”, to prawdopodobnie dlatego, że próbujesz uruchomić zapytanie rozproszone względem tabeli zawierającej jedną lub więcej kolumn z typami CLR.

Na przykład możesz wysyłać zapytania do tabeli, która używa geografii lub geometria typ danych w co najmniej jednej z jego kolumn. Te typy danych są zaimplementowane jako typy danych środowiska uruchomieniowego języka wspólnego (CLR) platformy .NET w programie SQL Server. Jak mówi komunikat o błędzie:„Obiekty eksponujące kolumny z typami CLR nie są dozwolone w zapytaniach rozproszonych”.

Na szczęście istnieje proste rozwiązanie tego problemu. Odpowiedzią jest pełny komunikat o błędzie.

Pobieranie błędu

Oto przykład zapytania rozproszonego, które powoduje błąd 7325.

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

Wynik:

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

W tym przypadku uruchomiłem zapytanie rozproszone na serwerze połączonym o nazwie „Homer”. Próbowałem wysłać zapytanie do tabeli „Dimension.City” w bazie danych „WideWorldImportersDW”, ale to nie zadziałało. Najwyraźniej tabela zawiera typ CLR.

Komunikat o błędzie sugeruje, że zamiast tego używam zapytania przekazującego:

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

Naprawianie błędu – zapytanie przekazujące

Nie jestem pewien, czy faktycznie jest to klasyfikowane jako „naprawianie” błędu, czy po prostu jako „obejście” błędu. Tak czy inaczej, komunikat o błędzie każe mi użyć zapytania przekazującego, więc to właśnie zrobię.

Korzystanie z zapytania przekazującego pozwala nam uruchamiać zapytania względem tabel zdalnych zawierających kolumny z typami CLR.

Możemy więc zmienić poprzednie zapytanie na następujące:

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

Po uruchomieniu tego zapytania otrzymuję oczekiwane wyniki bez błędów.

OPENQUERY() funkcja pozwala na uruchomienie zapytania przekazującego na podanym serwerze linkowanym. Pierwszy argument zawiera nazwę serwera połączonego, a drugi argument to zapytanie, które chcemy uruchomić (ujęte w pojedynczych cudzysłowach).

Możesz więc skopiować oryginalne zapytanie i wkleić je jako drugi argument. Jeśli to zrobisz, nie zapomnij usunąć nazwy serwera połączonego z zapytania, w przeciwnym razie otrzymasz kolejny błąd. W moim przykładzie musiałem usunąć „Homer” z Homer.WideWorldImportersDW.Dimension.City , tak aby stał się WideWorldImportersDW.Dimension.City . Dzieje się tak, ponieważ już podajemy nazwę połączonego serwera w pierwszym argumencie.

Znalezienie winowajcy

Jak wspomniano, komunikat o błędzie powiedział mi, że próbowałem wysłać zapytanie do kolumny z typem CLR. Mogę to zweryfikować, przeskakując do zdalnego (połączonego) serwera i uruchamiając następujący kod:

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

Wynik:

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

Widzimy, że Lokalizacja kolumna ma typ danych geografia , który jest typem CLR. To jest najbardziej prawdopodobna przyczyna błędu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy kończy się używanie zamyka otwarte połączenie SQL?

  2. SQL Server REPLACE() vs TRANSLATE():jakie są różnice?

  3. Jak wyeksportować wynik zapytania do pliku .csv lub pliku rozdzielanego tabulatorami w programie SQL Server Management Studio (SSMS) — samouczek SQL Server/TSQL — część 23

  4. Równoważnik funkcji Split w T-SQL?

  5. Dlaczego NULL =NULL daje wartość false w serwerze SQL?