是否可以在链接服务器上创建临时表?

时间:2010-02-05 18:53:15

标签: sql sql-server linked-server temp-tables

我正在对一个远程链接服务器进行一些相当复杂的查询,能够在临时表中存储一些信息然后对它进行连接是有用的 - 所有这些都与远程数据有关。在本地创建临时表并通过线路连接它们的速度非常慢。

是否可以强制在远程服务器上创建临时表?假设我没有足够的权限来创建我自己的真实(永久)表。

5 个答案:

答案 0 :(得分: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 :(得分:2)

无法在链接的远程服务器上直接创建临时表。实际上,您不能对链接服务器使用任何DDL。

有关使用链接服务器的准则和限制的详细信息,请参阅:

  

Guidelines for Using Distributed Queries (SQL 2008 Books Online)

一个解决方法(并且在我的头顶上,只有在远程服务器上拥有权限时才能使用)你可以:

    远程服务器上的
  • 有一个存储过程,它将创建一个持久表,其名称基于IN参数
  • 远程存储过程将运行查询,然后将结果插入此表
  • 然后,您可以在本地查询该表,并对所需的任何本地表执行任何连接
  • 在完成后调用远程服务器上的另一个存储过程以删除远程表

不理想,但可能会解决。

答案 2 :(得分: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)

这比实际使用更具有说服力!

答案 3 :(得分:1)

如果内存不是问题,您还可以使用表变量作为临时表的替代方法。当运行需要针对链接服务器的临时数据存储的存储过程时,这对我有用。

更多信息:例如this comparison表变量和临时表,包括使用表变量的缺点。

答案 4 :(得分:1)

我迟到了2年,但您可以使用sp_executeSQL完成此操作,并为其提供动态查询以远程创建表格。

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

这将在远程位置执行临时表创建..