2013-01-21 30 views
43

Tôi có hai Máy chủ SQL (đang chạy SQL Server 2008) có tên là DATA01DATA02. DATA02 có định nghĩa máy chủ được liên kết LINK, trỏ tại DATA01, với thiết lập ánh xạ người dùng phù hợp. Trên DATA01 có một cơ sở dữ liệu MyDatabase chứa hai bảng sau đây:Tại sao tôi nhận được lỗi "Loại dữ liệu Xml không được hỗ trợ trong truy vấn được phân phối" khi truy vấn máy chủ được liên kết cho dữ liệu không phải là xml?

CREATE TABLE T_A (
    Id int 
) 

CREATE TABLE T_B (
    Id int, 
    Stuff xml 
) 

Khi tôi chạy lệnh này từ DATA02, tôi nhận được dữ liệu trả về như mong đợi:

SELECT Id FROM LINK.MyDatabase.dbo.T_A; 

Tuy nhiên, khi tôi chạy lệnh này từ DATA02 , tôi nhận được một lỗi:

SELECT Id, Stuff FROM LINK.MyDatabase.dbo.T_B; 

lỗi này là

Xml data type is not supported in distributed queries. Remote object 'DATA02.MyDatabase.dbo.T_B' has xml column(s).

Và kỳ lạ, lệnh này:

SELECT Id FROM LINK.MyDatabase.dbo.T_B; 

cũng cung cấp cho các lỗi tương tự, mặc dù tôi không SELECT ing cột xml! Điều gì đang xảy ra?

Trả lời

72

Đây là sự thiếu trong SQL Server. Sự tồn tại chỉ của cột xml trên bảng ngăn không cho nó tham gia vào các truy vấn được phân phối (ví dụ như được truy vấn thông qua kết nối máy chủ được liên kết). Điều này is mentioned in the documentation, mặc dù không đặc biệt nổi bật. Bạn có thể xem số main Connect bug report heresimilar report here. Sau đó đưa ra hai cách giải quyết:

  1. Create [a] view without the XML column(s) on remote server and query that.

    Trong ví dụ của bạn, điều này sẽ đòi hỏi thêm một cái nhìn để MyDatabase trông như thế này:

    CREATE VIEW V_T_B AS SELECT Id FROM T_B; 
    

    Sau đó, bạn có thể truy vấn quan điểm này thông qua liên kết để có được dữ liệu Id . Lưu ý rằng một cái gì đó giống như

    SELECT Id FROM (SELECT Id FROM T_B) T_B; 
    

    không hoạt động.

  2. Use a pass-through query in the form

    SELECT * from OPENQUERY (...) 
    

    Phương pháp này có lợi thế là không yêu cầu thay đổi cơ sở dữ liệu nguồn ; Nhược điểm là không còn có thể sử dụng đặt tên bốn phần tiêu chuẩn cho cả dữ liệu cục bộ và dữ liệu được liên kết.Truy vấn sẽ trông như thế

    SELECT Id FROM OPENQUERY(DATA02, 'SELECT Id FROM T_B') T_B; 
    

    Lưu ý rằng nếu bạn thực sự làm muốn dữ liệu xml, phương pháp này (cùng với đúc đến và đi từ một kiểu dữ liệu phi xml) sẽ cần:

    SELECT Id, CAST(Stuff AS XML) Stuff 
    FROM OPENQUERY(DATA02, 'SELECT Id, CAST(Stuff AS nvarchar(max)) Stuff 
             FROM T_B') T_B; 
    

Lưu ý rằng lỗi này lần đầu tiên được báo cáo trong SQL server 2005, và vẫn chưa được định hình trong SQL server 2014.

+4

Bạn cũng có thể tạo thủ tục được lưu trữ trên DATA02 và gọi thủ tục được lưu trữ từ xa thay vì cố chạy truy vấn từ xa. –

+0

khi tôi tạo chế độ xem trên DB cục bộ, từ id chọn của bảng DB từ xa, tôi nhận được cùng một lỗi ... SQL SERVER 2008 R2 tại đây – RMiranda

+1

@RMiranda chế độ xem phải được tạo trên DB * từ xa, sau đó từ DB địa phương, bạn sẽ có thể truy vấn xem đó thông qua liên kết. – AakashM

9

Hãy thử điều này:

  • Tạo một cái nhìn về phía nguồn với xml cast để nvarchar (max):

CREATE VIEW vXMLTest AS CHỌN cast (Stuff như nvarchar (max)) như STUFF TỪ T_B

  • Bạn có thể chọn nó ở phía bên điểm đến với diễn viên để xml

CHỌN Cast (Stuff như XML) như Stuff TỪ OPENQUERY (DATA02, 'SELECT Stuff TỪ vXMLTest')

Giải pháp này làm việc cho tôi trong 2008R2.

+1

Ý tưởng tuyệt vời! Hoạt động tuyệt vời. – NealWalters

Các vấn đề liên quan