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

问题描述 投票:0回答:5

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

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

sql sql-server linked-server temp-tables
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

4
投票

我迟到了 2 年,但您可以使用

sp_executeSQL
并为其提供动态查询来远程创建表来完成此操作。

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

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


3
投票

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

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

分布式查询使用指南(SQL 2008 联机丛书)

一种解决方法(这是我的想法,只有当您在远程服务器上拥有权限时才有效),您可以:

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

并不理想,但可能是一种解决方法。


3
投票

是的,您可以,但它仅在连接期间持续。 您需要使用 EXECUTE AT 语法;

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

请参阅 比较查询远程执行选项 - EXECUTE AT - Microsoft Learn

在 SERVER2 上,以下内容将起作用(1 分钟);

SELECT * FROM ##example

但它在本地服务器上不起作用。
顺便说一句,如果您在使用 ##example 的第二台服务器上打开事务,则该对象将保留到事务关闭为止。 它还会阻止第一台服务器(即 server2)上的创建语句完成,并且 server1 上的事务将无限期地继续。

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

这比实际用途更学术!


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.