2011-01-20 36 views
11

Tôi muốn chèn một số dữ liệu trên máy chủ địa phương vào một máy chủ từ xa, và sử dụng sql sau:lỗi khi chèn vào máy chủ liên kết

select * into linkservername.mydbname.dbo.test from localdbname.dbo.test 

Nhưng nó ném các lỗi sau

Các tên đối tượng 'linkservername.mydbname.dbo.test' chứa nhiều hơn số tiền tố tối đa. Tối đa là 2.

Tôi có thể làm như thế nào?

Trả lời

12

Tôi không nghĩ rằng bảng mới được tạo với mệnh đề INTO hỗ trợ 4 tên phần. Bạn cần tạo bảng trước, sau đó sử dụng INSERT..SELECT để điền vào bảng đó.

(Xem phần ghi chú trong phần luận cứ trên MSDN: reference)

+0

Liên kết bị hỏng. – ketura

+0

cảm ơn, liên kết đã sửa đổi – richaux

10

Tuyên bố SELECT...INTO [new_table_name] hỗ trợ tối đa 2 tiền tố: [database].[schema].[table]

LƯU Ý: nó là performant hơn để kéo dữ liệu qua liên kết sử dụng SELECT INTO vs đẩy nó qua sử dụng INSERT INTO:

  1. SELECT INTO được ghi nhật ký tối thiểu.
  2. SELECT INTO không ngầm bắt đầu một giao dịch phân tán, thông thường.

Tôi thường nói, ở điểm # 2, vì trong hầu hết các trường hợp, giao dịch phân phối không được tạo ngầm khi sử dụng SELECT INTO. Nếu một dấu vết profiler cho bạn biết SQL Server vẫn ngầm tạo một giao dịch phân tán, trước tiên bạn có thể SELECT INTO một bảng tạm thời, để ngăn chặn giao dịch được phân phối ngầm, sau đó di chuyển dữ liệu vào bảng đích của bạn từ bảng tạm thời.

Đẩy vs Pull Ví dụ
Trong ví dụ này, chúng tôi đang sao chép dữ liệu từ [server_a] tới [server_b] qua một liên kết.Ví dụ này giả thực hiện truy vấn có thể từ cả hai máy chủ:

Đẩy
Thay vì kết nối với [server_a] và đẩy dữ liệu tới [server_b]:

INSERT INTO [server_b].[database].[schema].[table] 
SELECT * FROM [database].[schema].[table] 

Kéo
Kết nối với [server_b] và kéo dữ liệu từ [server_a]:

SELECT * INTO [database].[schema].[table] 
FROM [server_a].[database].[schema].[table] 
1

Tôi đã gặp sự cố tương tự và tôi đã thực hiện giải pháp sau: Nếu bạn có thể đăng nhập vào máy chủ từ xa nơi bạn muốn chèn dữ liệu bằng MSSQL hoặc sqlcmd và tạo lại truy vấn của mình ngược lại:

như vậy từ:

SELECT * INTO linkservername.mydbname.dbo.test 
FROM localdbname.dbo.test 

như sau:

SELECT * INTO localdbname.dbo.test 
FROM linkservername.mydbname.dbo.test 

Trong trường hợp của tôi nó hoạt động tốt.

@ 2Tải: Để chắc chắn INSERT INTO tốt hơn/hiệu quả hơn. Tuy nhiên đối với các truy vấn nhỏ và thao tác nhanh SELECT * INTO linh hoạt hơn vì nó tạo bảng ngay lập tức và chèn dữ liệu của bạn ngay lập tức, trong khi INSERT INTO yêu cầu tạo bảng (tùy chọn tự động nhận dạng và vv) trước khi bạn thực hiện chèn hoạt động.

0

Tôi đã đấu tranh với điều này trong một giờ qua. Bây giờ tôi nhận ra rằng sử dụng cú pháp

SELECT orderid, orderdate, empid, custid 
INTO [linkedserver].[database].[dbo].[table] 
FROM Sales.Orders; 

không hoạt động với máy chủ được liên kết. Bạn phải vào máy chủ được liên kết của mình và tạo bảng theo cách thủ công trước, sau đó sử dụng cú pháp sau:

INSERT INTO [linkedserver].[database].[dbo].[table] 
SELECT orderid, orderdate, empid, custid 
FROM Sales.Orders 
WHERE shipcountry = 'UK'; 
Các vấn đề liên quan