Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да коригирате грешка Msg 7325 в SQL Server:„Обекти, излагащи колони с типове CLR, не са разрешени в разпределени заявки“

Ако сте срещнали съобщение за грешка 7325 в SQL Server „Обекти, излагащи колони с типове CLR, не са разрешени в разпределени заявки“, това вероятно е защото се опитвате да изпълните разпределена заявка срещу таблица, която съдържа една или повече колони с типове CLR.

Например, може да правите заявка за таблица, която използва география или геометрия тип данни в една или повече от неговите колони. Тези типове данни се реализират като типове данни за .NET общ ​​език за изпълнение (CLR) в SQL Server. И както се казва в съобщението за грешка, „Обекти, излагащи колони с CLR типове, не са разрешени в разпределените заявки“.

За щастие има лесно решение за този проблем. И отговорът е предоставен с пълното съобщение за грешка.

Получаване на грешката

Ето пример за разпределена заявка, която води до грешка 7325.

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

Резултат:

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

В този случай изпълних разпределена заявка срещу свързан сървър, наречен „Homer“. Опитах се да направя заявка за таблицата „Dimension.City“ в базата данни „WideWorldImportersDW“, но не се получи. Очевидно таблицата съдържа тип CLR.

Съобщението за грешка предполага вместо това да използвам преходна заявка:

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

Отстраняване на грешката – преминаване на заявка

Не съм сигурен дали това всъщност е класифицирано като „поправяне“ на грешката или просто като „заобикаляне“ на грешката. Така или иначе, съобщението за грешка ми казва да използвам преходна заявка, така че това ще направя.

Използването на преходна заявка ни позволява да изпълняваме заявки към отдалечени таблици, които съдържат колони с типове CLR.

Така че бихме могли да променим предишната заявка в следната:

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

Когато стартирам тази заявка, получавам очакваните резултати без грешка.

OPENQUERY() функцията ни позволява да изпълним преходна заявка на посочения свързан сървър. Първият аргумент съдържа името на свързания сървър, а вторият аргумент е заявката, която искаме да изпълним (оградена в единични кавички).

Така че можете да копирате оригиналната заявка и да я поставите като втори аргумент. Ако направите това, не забравяйте да премахнете името на свързания сървър от заявката, в противен случай ще получите друга грешка. В моя пример трябваше да премахна „Homer“ от Homer.WideWorldImportersDW.Dimension.City , така че да стане WideWorldImportersDW.Dimension.City . Това е така, защото вече предоставяме името на свързания сървър в първия аргумент.

Намиране на виновника

Както споменахме, съобщението за грешка ми каза, че се опитвам да направя заявка за колона с тип CLR. Мога да потвърдя това, като прескоча към отдалечения (свързан) сървър и изпълня следния код:

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

Резултат:

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

Можем да видим, че Местоположение колоната има тип данни география , който е тип CLR. Това е най-вероятната причина за грешката.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CTE безкраен цикъл с ОПЦИЯ (макс. рекурсия 0)

  2. Как да се покаже дата в британски формат в SQL Server (T-SQL)

  3. Поправете „SQL Server блокира достъпа до STATEMENT „OpenRowset/OpenDatasource“ на компонент „Ad Hoc разпределени заявки“

  4. Автоматизиране на обработката на табличен модел на бази данни на услугите за анализ (SSAS) в SQL Server

  5. Вземете краткото име в SQL Server (T-SQL)