2010-02-05 3 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

Если память не является большой проблемой, вы можете также использовать переменные таблицы в качестве альтернативы временным таблицам. Это работало для меня при запуске хранимой процедуры с необходимостью временного хранения данных против Linked Server.

Дополнительная информация: например, this comparison переменных таблицы и временных таблиц, включая недостатки использования переменных таблицы.

+0

Недостатка этого является то, что, насколько я знаю, вы не можете создавать индексы таблицы переменных. (Мне уже 2 года, я знаю ...) – alfoks

+2

Кажется, вы можете [создавать индексы на табличных переменных] (http://sqlserverplanet.com/tsql/create-index-on-table-variable). (Не знаю, что либо!) – Josien

+0

Отлично! Спасибо, что поделился. Я буду иметь это в виду в будущем. – alfoks

2

Да, вы можете, но это длится только на время соединения. Вам необходимо использовать синтаксис EXECUTE AT;

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

На SERVER2 будет работать (в течение 1 минуты);

SELECT * FROM ##example 

но он не будет работать на локальном сервере. Если вы открываете транзакцию на втором сервере, который использует ## example, объект остается до закрытия транзакции. Он также прекращает выполнение инструкции создания на первом сервере. то есть на сервере2, и транзакция на сервере1 будет продолжаться неопределенно.

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

Это более практичный, чем практическое применение!

1

Я опоздал на 2 года, но вы можете выполнить это с помощью sp_executeSQL и подавать им динамический запрос для создания таблицы удаленно.

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

Это будет выполнять создание временной таблицы в удаленном месте ..

Смежные вопросы