能否在链接服务器上创建临时表?

9

我正在远程链接的服务器上执行一些相当复杂的查询,如果能够在临时表中存储一些信息并针对远程数据执行联接将会非常有用。但是,在本地创建临时表并通过网络进行联接的速度非常慢。

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

5个回答

5

在我的环境中,这适用于连接到 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

3

我晚了2年才来参加这个派对,但是你可以使用sp_executeSQL并向其提供一个动态查询来远程创建表。

Exec RemoteServer.RemoteDatabase.RemoteSchema.SP_ExecuteSQL N'在这里创建表'

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


2

是的,你可以这样做,但它只能在连接期间持续有效。你需要使用“EXECUTE AT”语法。

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

在SERVER2上,以下内容将起作用(持续1分钟);
SELECT * FROM ##example

但它在本地服务器上不起作用。顺便说一下,如果您在第二个服务器上打开使用##example的事务,则该对象将保留,直到关闭事务为止。 它还会阻止第一个服务器上创建语句的完成。 也就是说,在server2上运行时,server1上的事务将无限期地继续。

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

这更偏向于学术性而非实用性!


2
无法直接在链接的远程服务器上创建临时表,实际上你不能对链接服务器使用任何DDL语句。有关使用链接服务器的指南和限制的更多信息,请参见:使用分布式查询的指南(SQL 2008 Books Online)。其中一个解决方法(只有在你拥有远程服务器权限时才能运行):
1. 在远程服务器上创建一个存储过程,该存储过程将创建一个基于输入参数命名的持久表。 2. 远程存储过程将运行查询,然后将结果插入到此表中。 3. 然后在本地对该表进行查询,执行所需的任何本地表连接。 4. 完成后,调用远程服务器上的另一个存储过程以删除远程表。
虽然不完美,但是这是一种可能的解决方法。

1
如果内存不是太大的问题,您也可以使用表变量作为临时表的替代方案。当针对链接服务器运行需要临时数据存储的存储过程时,这对我很有用。
更多信息:例如此比较表变量和临时表,包括使用表变量的缺点。

这样做的缺点是,据我所知,您无法在表变量上创建索引。(我知道我晚了2年...) - alfoks
2
看起来你可以在表变量上创建索引。(我也不知道!) - Josien
太棒了!谢谢分享。我会记住的,将来会用得到。 - alfoks
不幸的是,我认为这对于链接服务器不起作用——至少不能使用 execute-at。 - Kaganar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接