Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So beheben Sie die Fehlermeldung 7325 in SQL Server:„Objekte, die Spalten mit CLR-Typen verfügbar machen, sind in verteilten Abfragen nicht zulässig“

Wenn Sie in SQL Server auf die Fehlermeldung 7325 „Objekte, die Spalten mit CLR-Typen verfügbar machen, sind in verteilten Abfragen nicht zulässig“ gestoßen sind, liegt das wahrscheinlich daran, dass Sie versuchen, eine verteilte Abfrage für eine Tabelle auszuführen, die eine oder mehrere Spalten mit CLR-Typen enthält.

Beispielsweise könnten Sie eine Tabelle abfragen, die eine Geographie verwendet oder Geometrie Datentyp in einer oder mehreren seiner Spalten. Diese Datentypen werden als .NET Common Language Runtime (CLR)-Datentypen in SQL Server implementiert. Und wie die Fehlermeldung sagt:„Objekte, die Spalten mit CLR-Typen verfügbar machen, sind in verteilten Abfragen nicht zulässig.“

Glücklicherweise gibt es eine einfache Lösung für dieses Problem. Und die Antwort wird mit der vollständigen Fehlermeldung geliefert.

Fehler erhalten

Hier ist ein Beispiel für eine verteilte Abfrage, die zu Fehler 7325 führt.

SELECT TOP(10) * 
FROM Homer.WideWorldImportersDW.Dimension.City;

Ergebnis:

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"'.
zuzugreifen

In diesem Fall habe ich eine verteilte Abfrage gegen einen Verbindungsserver namens „Homer“ ausgeführt. Ich habe versucht, die Tabelle „Dimension.City“ in der Datenbank „WideWorldImportersDW“ abzufragen, aber es hat nicht funktioniert. Anscheinend enthält die Tabelle einen CLR-Typ.

Die Fehlermeldung schlägt vor, dass ich stattdessen eine Pass-Through-Abfrage verwende:

Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.

Fehlerbehebung – Pass-Through-Abfrage

Ich bin mir nicht sicher, ob dies tatsächlich als „Beheben“ des Fehlers oder einfach als „Umgehen“ des Fehlers eingestuft wird. In jedem Fall sagt mir die Fehlermeldung, dass ich eine Pass-Through-Abfrage verwenden soll, also werde ich das tun.

Durch die Verwendung einer Pass-Through-Abfrage können wir Abfragen für entfernte Tabellen ausführen, die Spalten mit CLR-Typen enthalten.

Wir könnten also die vorherige Abfrage wie folgt ändern:

SELECT TOP(10) *  
FROM OPENQUERY(
    Homer, 
    'SELECT * FROM WideWorldImportersDW.Dimension.City'
    );

Wenn ich diese Abfrage ausführe, erhalte ich die erwarteten Ergebnisse ohne Fehler.

Das OPENQUERY() -Funktion ermöglicht es uns, eine Pass-Through-Abfrage auf dem angegebenen Verbindungsserver auszuführen. Das erste Argument enthält den Namen des Verbindungsservers, und das zweite Argument ist die Abfrage, die wir ausführen möchten (in einfachen Anführungszeichen eingeschlossen).

Sie können also die ursprüngliche Abfrage kopieren und als zweites Argument einfügen. Wenn Sie dies tun, vergessen Sie nicht, den verknüpften Servernamen aus der Abfrage zu entfernen, da Sie sonst einen weiteren Fehler erhalten. In meinem Beispiel musste ich „Homer“ aus Homer.WideWorldImportersDW.Dimension.City entfernen , sodass daraus WideWorldImportersDW.Dimension.City wurde . Das liegt daran, dass wir bereits den Namen des Verbindungsservers im ersten Argument angeben.

Den Schuldigen finden

Wie bereits erwähnt, sagte mir die Fehlermeldung, dass ich versucht habe, eine Spalte mit einem CLR-Typ abzufragen. Ich kann dies überprüfen, indem ich zum entfernten (verbundenen) Server springe und den folgenden Code ausführe:

USE WideWorldImportersDW;
SELECT 
  COLUMN_NAME,
  DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'City'
  AND TABLE_SCHEMA = 'Dimension';

Ergebnis:

+----------------------------+-------------+
| 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         |
+----------------------------+-------------+

Wir können sehen, dass die Location Spalte hat den Datentyp geography , bei dem es sich um einen CLR-Typ handelt. Dies ist die wahrscheinlichste Fehlerursache.