Om du har stött på felmeddelande 7325 i SQL Server "Objekt som exponerar kolumner med CLR-typer är inte tillåtna i distribuerade frågor" beror det förmodligen på att du försöker köra en distribuerad fråga mot en tabell som innehåller en eller flera kolumner med CLR-typer.
Du kan till exempel fråga efter en tabell som använder en geografi eller geometri datatyp i en eller flera av dess kolumner. Dessa datatyper implementeras som .NET Common Language Runtime (CLR) datatyper i SQL Server. Och som felmeddelandet säger, "Objekt som exponerar kolumner med CLR-typer är inte tillåtna i distribuerade frågor".
Lyckligtvis finns det en enkel lösning på det här problemet. Och svaret tillhandahålls med det fullständiga felmeddelandet.
Hämtar felet
Här är ett exempel på en distribuerad fråga som resulterar i fel 7325.
SELECT TOP(10) * FROM Homer.WideWorldImportersDW.Dimension.City;
Resultat:
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"'.
I det här fallet körde jag en distribuerad fråga mot en länkad server som heter "Homer". Jag försökte fråga tabellen "Dimension.City" i databasen "WideWorldImportersDW", men det fungerade inte. Tydligen innehåller tabellen en CLR-typ.
Felmeddelandet antyder att jag använder en genomkopplingsfråga istället:
Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
Åtgärda felet – genomgångsfråga
Jag är inte säker på om detta faktiskt klassificeras som att "åtgärda" felet eller helt enkelt som att "lösa" felet. Hur som helst, felmeddelandet talar om för mig att använda en pass-through-fråga så det är vad jag ska göra.
Genom att använda en pass-through-fråga kan vi köra frågor mot fjärrtabeller som innehåller kolumner med CLR-typer.
Så vi kunde ändra den tidigare frågan till följande:
SELECT TOP(10) * FROM OPENQUERY( Homer, 'SELECT * FROM WideWorldImportersDW.Dimension.City' );
När jag kör den frågan får jag de förväntade resultaten utan fel.
OPENQUERY()
funktionen låter oss köra en genomkopplingsfråga på den angivna länkade servern. Det första argumentet innehåller det länkade servernamnet, och det andra argumentet är frågan som vi vill köra (omsluten av enkla citattecken).
Så du kan kopiera den ursprungliga frågan och klistra in den som det andra argumentet. Om du gör detta, glöm inte att ta bort det länkade servernamnet från frågan, annars får du ett nytt fel. I mitt exempel var jag tvungen att ta bort "Homer" från Homer.WideWorldImportersDW.Dimension.City
, så att det blev WideWorldImportersDW.Dimension.City
. Detta beror på att vi redan anger namnet på den länkade servern i det första argumentet.
Hitta den skyldige
Som nämnts sa felmeddelandet mig att jag försökte fråga en kolumn med en CLR-typ. Jag kan verifiera detta genom att hoppa över till fjärrservern (länkad) och köra följande kod:
USE WideWorldImportersDW; SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'City' AND TABLE_SCHEMA = 'Dimension';
Resultat:
+----------------------------+-------------+ | 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 | +----------------------------+-------------+
Vi kan se att Plats kolumnen har datatypen geografi , som är en CLR-typ. Detta är den mest troliga orsaken till felet.