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.