2010-02-05 28 views
7

Tôi đang thực hiện một số truy vấn khá phức tạp đối với máy chủ được liên kết từ xa và sẽ hữu ích khi có thể lưu trữ một số thông tin trong bảng tạm thời và sau đó thực hiện kết nối với nó - tất cả đều có dữ liệu từ xa. Tạo các bảng tạm thời tại địa phương và tham gia chống lại chúng qua dây dẫn là rất chậm.Có thể tạo bảng tạm thời trên máy chủ được liên kết không?

Có thể buộc bảng tạm thời được tạo trên máy chủ từ xa không? Giả sử tôi không có đủ đặc quyền để tạo các bảng (vĩnh viễn) thực của riêng tôi.

Trả lời

2

Không thể trực tiếp tạo bảng tạm thời trên máy chủ từ xa được liên kết. Trong thực tế, bạn không thể sử dụng bất kỳ DDL nào đối với một máy chủ được liên kết.

Để biết thêm về các chủ trương, những hạn chế của việc sử dụng các máy chủ liên kết xem:

Guidelines for Using Distributed Queries (SQL 2008 Books Online)

Một công trình xung quanh (và ra khỏi đỉnh đầu của tôi, và điều này sẽ chỉ làm việc nếu bạn có quyền trên máy chủ từ xa), bạn có thể:

  • trên máy chủ từ xa có quy trình được lưu trữ sẽ tạo bảng ổn định, với tên cơ sở d trên một tham số TRÊN
  • các thủ tục lưu trữ từ xa sẽ chạy một truy vấn sau đó chèn kết quả vào bảng này
  • Sau đó bạn truy vấn địa phương chống lại bảng đó thực hiện bất kỳ tham gia vào bất kỳ bảng địa phương cần
  • Gọi một thủ tục được lưu trữ trên máy chủ từ xa để thả bảng điều khiển từ xa khi bạn hoàn thành

Không lý tưởng, nhưng có thể làm việc xung quanh.

4

Điều này hoạt động từ SQL 2005 SP3 được liên kết với SQL 2005 SP3 trong môi trường của tôi. Tuy nhiên nếu bạn kiểm tra tempdb, bạn sẽ thấy rằng bảng thực sự là trên cá thể cục bộ chứ không phải cá thể từ xa. Tôi đã thấy điều này như một giải pháp trên các diễn đàn khác và muốn chỉ đạo bạn tránh xa điều này.

create table SecondServer.#doll 
(
    name varchar(128) 
) 
GO 
insert SecondServer.#Doll 
select name from sys.objects where type = 'u' 


select * from SecondServer.#Doll 
1

Nếu bộ nhớ không phải là vấn đề lớn, bạn cũng có thể sử dụng các biến bảng để thay thế cho các bảng tạm thời. Điều này làm việc cho tôi khi chạy một thủ tục được lưu trữ với nhu cầu lưu trữ dữ liệu tạm thời đối với một Máy chủ được liên kết.

Thông tin khác: ví dụ: this comparison các biến bảng và bảng tạm thời, bao gồm các hạn chế của việc sử dụng các biến bảng.

+0

Hạn chế này là, như xa như tôi biết, bạn không thể tạo chỉ số trên bảng biến. (Tôi trễ 2 năm, tôi biết ...) – alfoks

+2

Có vẻ như bạn có thể [tạo các chỉ mục trên các biến bảng] (http://sqlserverplanet.com/tsql/create-index-on-table-variable). (Không biết điều đó!) – Josien

+0

Tuyệt vời! Cám ơn vì đã chia sẻ. Tôi sẽ ghi nhớ điều này trong tương lai. – alfoks

2

Có, bạn có thể nhưng nó chỉ kéo dài trong suốt thời gian kết nối. Bạn cần sử dụng cú pháp EXECUTE AT;

EXECUTE('SELECT * INTO ##example FROM sys.objects; WAITFOR DELAY ''00:01:00''') AT [SERVER2] 

Trên SERVER2 mục sau đây sẽ hoạt động (trong 1 phút);

SELECT * FROM ##example 

nhưng nó sẽ không hoạt động trên máy chủ cục bộ. Chắc chắn nếu bạn mở một giao dịch trên máy chủ thứ hai sử dụng ## example đối tượng vẫn còn cho đến khi giao dịch được đóng lại. Nó cũng dừng câu lệnh tạo trên máy chủ đầu tiên hoàn thành. tức là trên server2 chạy và giao dịch trên server1 sẽ tiếp tục không chính xác.

BEGIN TRAN 
SELECT * FROM ##example WITH (TABLOCKX) 

Điều này dễ bị sử dụng thực tế hơn!

1

Tôi trễ 2 năm cho bữa tiệc nhưng bạn có thể thực hiện việc này bằng cách sử dụng sp_executeSQL và cho nó một truy vấn động để tạo bảng từ xa.

Exec RemoteServer.RemoteDatabase.RemoteSchema.SP_ExecuteSQL N'Create Table here'

này sẽ thực hiện việc tạo ra bảng tạm thời tại địa điểm từ xa ..

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