Nếu bạn gặp phải thông báo lỗi 7325 trong SQL Server “Đối tượng hiển thị cột có loại CLR không được phép trong truy vấn phân tán” thì có thể là do bạn đang cố chạy truy vấn phân tán dựa trên bảng chứa một hoặc nhiều cột có loại CLR.
Ví dụ:bạn có thể đang truy vấn một bảng sử dụng địa lý hoặc hình học kiểu dữ liệu trong một hoặc nhiều cột của nó. Các kiểu dữ liệu này được triển khai dưới dạng kiểu dữ liệu thời gian chạy ngôn ngữ chung .NET (CLR) trong SQL Server. Và như thông báo lỗi cho biết, "Đối tượng hiển thị cột có loại CLR không được phép trong truy vấn phân tán".
May mắn thay, có một cách khắc phục dễ dàng cho vấn đề này. Và câu trả lời được cung cấp với thông báo lỗi đầy đủ.
Nhận lỗi
Dưới đây là ví dụ về truy vấn phân tán dẫn đến lỗi 7325.
SELECT TOP(10) * FROM Homer.WideWorldImportersDW.Dimension.City;
Kết quả:
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"'.
Trong trường hợp này, tôi đã chạy một truy vấn phân tán chống lại một máy chủ được liên kết có tên là “Homer”. Tôi đang cố gắng truy vấn bảng “Dimension.City” trên cơ sở dữ liệu “WideWorldImportersDW”, nhưng nó không hoạt động. Rõ ràng bảng có chứa loại CLR.
Thông báo lỗi gợi ý rằng tôi nên sử dụng truy vấn chuyển qua thay thế:
Please use a pass-through query to access remote object '"WideWorldImportersDW"."Dimension"."City"'.
Khắc phục lỗi - Truy vấn chuyển qua
Tôi không chắc liệu điều này có thực sự được phân loại là "sửa" lỗi hay chỉ đơn giản là "khắc phục" lỗi. Dù bằng cách nào, thông báo lỗi cho tôi biết sử dụng truy vấn chuyển qua để đó là những gì tôi sẽ làm.
Sử dụng truy vấn chuyển qua cho phép chúng tôi chạy truy vấn đối với các bảng từ xa có chứa các cột có kiểu CLR.
Vì vậy, chúng tôi có thể thay đổi truy vấn trước đó thành truy vấn sau:
SELECT TOP(10) * FROM OPENQUERY( Homer, 'SELECT * FROM WideWorldImportersDW.Dimension.City' );
Khi tôi chạy truy vấn đó, tôi nhận được kết quả mong đợi mà không bị lỗi.
OPENQUERY()
chức năng cho phép chúng tôi chạy một truy vấn chuyển qua trên máy chủ được liên kết được chỉ định. Đối số đầu tiên chứa tên máy chủ được liên kết và đối số thứ hai là truy vấn mà chúng tôi muốn chạy (được đặt trong dấu ngoặc kép).
Vì vậy, bạn có thể sao chép truy vấn ban đầu và dán nó làm đối số thứ hai. Nếu bạn làm điều này, đừng quên xóa tên máy chủ được liên kết khỏi truy vấn, nếu không bạn sẽ gặp một lỗi khác. Trong ví dụ của tôi, tôi phải xóa “Homer” khỏi Homer.WideWorldImportersDW.Dimension.City
, để nó trở thành WideWorldImportersDW.Dimension.City
. Điều này là do chúng tôi đã cung cấp tên của máy chủ được liên kết trong đối số đầu tiên.
Tìm thủ phạm
Như đã đề cập, thông báo lỗi cho tôi biết rằng tôi đang cố gắng truy vấn một cột có kiểu CLR. Tôi có thể xác minh điều này bằng cách chuyển đến máy chủ từ xa (được liên kết) và chạy mã sau:
USE WideWorldImportersDW; SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'City' AND TABLE_SCHEMA = 'Dimension';
Kết quả:
+----------------------------+-------------+ | 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 | +----------------------------+-------------+
Chúng ta có thể thấy rằng Vị trí cột có loại dữ liệu là địa lý , là loại CLR. Đây là nguyên nhân rất có thể gây ra lỗi.