我正在对远程链接服务器进行一些相当复杂的查询,能够将一些信息存储在临时表中然后对其执行连接会很有用——所有这些都使用远程数据。在本地创建临时表并通过网络连接它们非常慢。
是否可以强制在远程服务器上创建临时表?假设我没有足够的权限来创建自己的真实(永久)表。
我正在对远程链接服务器进行一些相当复杂的查询,能够将一些信息存储在临时表中然后对其执行连接会很有用——所有这些都使用远程数据。在本地创建临时表并通过网络连接它们非常慢。
是否可以强制在远程服务器上创建临时表?假设我没有足够的权限来创建自己的真实(永久)表。
这适用于在我的环境中链接到 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
我迟到了 2 年,但您可以使用sp_executeSQL
动态查询并为其提供动态查询以远程创建表。
Exec RemoteServer.RemoteDatabase.RemoteSchema.SP_ExecuteSQL N'Create Table here'
这将在远程位置执行临时表创建..
无法在链接的远程服务器上直接创建临时表。事实上,您不能对链接服务器使用任何 DDL。
有关使用链接服务器的指南和限制的更多信息,请参阅:
一种解决方法(并且在我的脑海中,这只有在您对远程服务器具有权限的情况下才有效)您可以:
不理想,但可能的解决方法。
是的,您可以,但它仅在连接期间持续。您需要使用 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)
这比实际使用更学术!
如果内存不是什么大问题,您还可以使用表变量来替代临时表。当运行需要针对链接服务器进行临时数据存储的存储过程时,这对我有用。
更多信息:例如表变量和临时表的比较,包括使用表变量的缺点。