Pokud jste na serveru SQL narazili na chybovou zprávu 7325 „Objekty odhalující sloupce s typy CLR nejsou povoleny v distribuovaných dotazech“, je to pravděpodobně proto, že se pokoušíte spustit distribuovaný dotaz pro tabulku, která obsahuje jeden nebo více sloupců s typy CLR.
Můžete se například dotazovat na tabulku, která používá geografii nebo geometrie datový typ v jednom nebo více jeho sloupcích. Tyto datové typy jsou implementovány jako datové typy .NET common language runtime (CLR) na serveru SQL Server. A jak říká chybová zpráva:„Objekty odhalující sloupce s typy CLR nejsou v distribuovaných dotazech povoleny.“
Naštěstí existuje jednoduchá oprava tohoto problému. A odpověď je poskytnuta s úplnou chybovou zprávou.
Získávání chyby
Zde je příklad distribuovaného dotazu, jehož výsledkem je chyba 7325.
SELECT TOP(10) * FROM Homer.WideWorldImportersDW.Dimension.City;
Výsledek:
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"'.
V tomto případě jsem spustil distribuovaný dotaz proti propojenému serveru s názvem „Homer“. Pokoušel jsem se dotazovat na tabulku „Dimension.City“ v databázi „WideWorldImportersDW“, ale nefungovalo to. Tabulka zřejmě obsahuje typ CLR.
Chybová zpráva navrhuje, abych místo toho použil předávací dotaz:
Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
Oprava chyby – předávací dotaz
Nejsem si jistý, zda je to skutečně klasifikováno jako „oprava“ chyby nebo jednoduše jako „obcházení“ chyby. V každém případě mi chybová zpráva říká, že mám použít předávací dotaz, takže to udělám.
Použití předávacího dotazu nám umožňuje spouštět dotazy proti vzdáleným tabulkám, které obsahují sloupce s typy CLR.
Takže bychom mohli změnit předchozí dotaz na následující:
SELECT TOP(10) * FROM OPENQUERY( Homer, 'SELECT * FROM WideWorldImportersDW.Dimension.City' );
Když spustím tento dotaz, dostanu očekávané výsledky bez chyby.
OPENQUERY()
Funkce nám umožňuje spustit předávací dotaz na zadaném propojeném serveru. První argument obsahuje název propojeného serveru a druhý argument je dotaz, který chceme spustit (uzavřený v jednoduchých uvozovkách).
Takže můžete zkopírovat původní dotaz a vložit jej jako druhý argument. Pokud to uděláte, nezapomeňte z dotazu odstranit název propojeného serveru, jinak se zobrazí další chyba. V mém příkladu jsem musel odstranit „Homer“ z Homer.WideWorldImportersDW.Dimension.City
, takže se stal WideWorldImportersDW.Dimension.City
. Důvodem je, že název propojeného serveru již poskytujeme v prvním argumentu.
Hledání viníka
Jak již bylo zmíněno, chybová zpráva mi řekla, že se pokouším dotazovat sloupec s typem CLR. Mohu to ověřit skokem na vzdálený (propojený) server a spuštěním následujícího kódu:
USE WideWorldImportersDW; SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'City' AND TABLE_SCHEMA = 'Dimension';
Výsledek:
+----------------------------+-------------+ | 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 | +----------------------------+-------------+
Vidíme, že Umístění sloupec má datový typ geografie , což je typ CLR. Toto je nejpravděpodobnější příčina chyby.