sql >> Databasteknik >  >> RDS >> Sqlserver

Så här åtgärdar du felmeddelande 7325 i SQL Server:"Objekt som exponerar kolumner med CLR-typer är inte tillåtna i distribuerade frågor"

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.


  1. Komma igång med PostgreSQL 11 på Ubuntu 18.04

  2. Fördjupad undersökning av säkerhet på radnivå

  3. Hur man skapar lagrad procedur i MySQL

  4. En guide till databasautomatisering med Severalnines ClusterControl