2010-02-05 36 views
7

我正在對遠程鏈接服務器進行一些相當複雜的查詢,並且能夠將某些信息存儲在臨時表中,然後對它執行連接 - 全部使用遠程數據將會非常有用。在本地創建臨時表並通過電線連接它們的速度非常慢。是否可以在鏈接的服務器上創建臨時表?

是否可以強制在遠程服務器上創建臨時表?假設我沒有足夠的權限來創建我自己的真實(永久)表。

回答

2

無法在鏈接的遠程服務器上直接創建臨時表。事實上,你不能在鏈接的服務器上使用任何DDL。

有關使用鏈接的服務器的指引和限制的詳細信息,請參閱:

Guidelines for Using Distributed Queries (SQL 2008 Books Online)

一個解決(和關閉我的頭頂部,這將只有當你的工作在遠程服務器上有權限):

  • 在遠程服務器上有一個存儲過程,該存儲過程將創建一個具有名稱基礎的持久表d上一個IN參數
  • 遠程存儲過程將運行一個查詢,然後將結果插入此表
  • 然後,您可以查詢本地對這個表進行任何連接到任何本地表所需
  • 呼籲其他存儲過程遠程服務器在完成後丟棄遠程表

不理想,但可能會解決此問題。

4

這適用於從我的環境中鏈接到SQL 2005 SP3的SQL 2005 SP3。但是,如果檢查tempdb,則會發現該表實際上是在本地實例上,而不是在遠程實例上。我已將此視爲其他論壇上的決議,並希望引導您遠離這一點。

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


select * from SecondServer.#Doll 
1

如果內存不是一個問題,你也可以使用表變量作爲臨時表的替代。這對於運行需要臨時數據存儲的存儲過程的鏈接服務器時適用。

更多信息:例如this comparison表變量和臨時表,包括使用表變量的缺點。

+0

的缺點這是,據我所知,你不能創建表變量指標。 (我遲了2年,我知道...) – alfoks 2013-05-31 09:57:06

+2

看來你可以[在表變量上創建索引](http://sqlserverplanet.com/tsql/create-index-on-table-variable)。 (不知道那個!) – Josien 2013-05-31 10:27:11

+0

太棒了!感謝分享。我將來會記住它。 – alfoks 2013-06-02 20:06:54

2

是的,你可以,但它只能持續連接的持續時間。 您需要使用EXECUTE AT語法;

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

在SERVER2上,以下內容將工作(1分鐘);

SELECT * FROM ##example 

但它不會在本地服務器上工作。 如果您在使用##的第二臺服務器上打開一個事務,那麼該對象將一直保留,直到事務關閉。它也會停止第一臺服務器上的創建語句完成。即在server2上運行,server1上的事務將無限期地繼續。

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

這比實際使用更加學術化!

1

我對派對遲了2年,但您可以使用sp_executeSQL完成此操作,併爲其提供動態查詢以遠程創建表格。

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

這將在遠程位置執行該臨時表創建..

相關問題