sql >> Databáze >  >> RDS >> Sqlserver

Jak opravit chybu Msg 7325 na serveru SQL Server:„Objekty odhalující sloupce s typy CLR nejsou povoleny v distribuovaných dotazech“

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.


  1. Jak vytvořit databázi v MySQL

  2. Jak najít aktuální otevřené kurzory v Oracle

  3. Příklady DAYOFMONTH() – MySQL

  4. Získejte název dne z data v PostgreSQL