Als u foutbericht 7325 bent tegengekomen in SQL Server "Objecten die kolommen met CLR-typen weergeven, zijn niet toegestaan in gedistribueerde query's", komt dat waarschijnlijk omdat u een gedistribueerde query probeert uit te voeren op een tabel die een of meer kolommen met CLR-typen bevat.
U kunt bijvoorbeeld een query uitvoeren op een tabel die gebruikmaakt van een geografie of geometrie gegevenstype in een of meer van zijn kolommen. Deze gegevenstypen worden geïmplementeerd als .NET Common Language Runtime (CLR)-gegevenstypen in SQL Server. En zoals de foutmelding zegt:"Objecten die kolommen met CLR-types weergeven, zijn niet toegestaan in gedistribueerde zoekopdrachten".
Gelukkig is er een eenvoudige oplossing voor dit probleem. En het antwoord wordt geleverd met de volledige foutmelding.
De fout krijgen
Hier is een voorbeeld van een gedistribueerde zoekopdracht die resulteert in fout 7325.
SELECT TOP(10) * FROM Homer.WideWorldImportersDW.Dimension.City;
Resultaat:
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"'.
In dit geval heb ik een gedistribueerde query uitgevoerd tegen een gekoppelde server genaamd "Homer". Ik probeerde de tabel "Dimension.City" in de database "WideWorldImportersDW" te doorzoeken, maar het werkte niet. Blijkbaar bevat de tabel een CLR-type.
De foutmelding suggereert dat ik in plaats daarvan een pass-through-query gebruik:
Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
De fout oplossen - Pass-Through-query
Ik weet niet zeker of dit is geclassificeerd als het "repareren" van de fout of gewoon als het "omzeilen" van de fout. Hoe dan ook, de foutmelding vertelt me dat ik een pass-through-query moet gebruiken, dus dat is wat ik zal doen.
Door een pass-through-query te gebruiken, kunnen we query's uitvoeren op externe tabellen die kolommen met CLR-typen bevatten.
We kunnen de vorige zoekopdracht dus in het volgende veranderen:
SELECT TOP(10) * FROM OPENQUERY( Homer, 'SELECT * FROM WideWorldImportersDW.Dimension.City' );
Als ik die query uitvoer, krijg ik de verwachte resultaten zonder fouten.
De OPENQUERY()
functie stelt ons in staat om een pass-through-query uit te voeren op de opgegeven gekoppelde server. Het eerste argument bevat de naam van de gekoppelde server en het tweede argument is de query die we willen uitvoeren (tussen enkele aanhalingstekens).
U kunt dus de originele query kopiëren en als tweede argument plakken. Als u dit doet, vergeet dan niet de gekoppelde servernaam uit de zoekopdracht te verwijderen, anders krijgt u een nieuwe foutmelding. In mijn voorbeeld moest ik de "Homer" verwijderen uit Homer.WideWorldImportersDW.Dimension.City
, zodat het WideWorldImportersDW.Dimension.City
. werd . Dit komt omdat we de naam van de gekoppelde server al in het eerste argument opgeven.
De dader vinden
Zoals vermeld, vertelde de foutmelding me dat ik probeerde een kolom met een CLR-type te doorzoeken. Ik kan dit verifiëren door naar de externe (gekoppelde) server te springen en de volgende code uit te voeren:
USE WideWorldImportersDW; SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'City' AND TABLE_SCHEMA = 'Dimension';
Resultaat:
+----------------------------+-------------+ | 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 | +----------------------------+-------------+
We kunnen zien dat de Locatie kolom heeft het gegevenstype geografie , wat een CLR-type is. Dit is de meest waarschijnlijke oorzaak van de fout.