Можно ли создать временную таблицу на связанном сервере? - PullRequest
8 голосов
/ 05 февраля 2010

Я делаю довольно сложные запросы к удаленному связанному серверу, и было бы полезно иметь возможность хранить некоторую информацию во временных таблицах, а затем выполнять соединения с ней - все с удаленными данными. Локально создавать временные таблицы и соединяться с ними по проводам слишком медленно.

Можно ли принудительно создать временную таблицу на удаленном сервере? Предположим, у меня недостаточно прав для создания собственных реальных (постоянных) таблиц.

Ответы [ 5 ]

4 голосов
/ 05 февраля 2010

Это работает с 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 голосов
/ 18 ноября 2011

Да, вы можете, но это длится только на время соединения. Вам необходимо использовать синтаксис 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)

Это более академично, чем практическое использование!

2 голосов
/ 05 февраля 2010

Невозможно напрямую создать временные таблицы на связанном удаленном сервере. На самом деле вы не можете использовать DDL против связанного сервера.

Для получения дополнительной информации о правилах и ограничениях использования связанных серверов см .:

Рекомендации по использованию распределенных запросов (Электронная документация по SQL 2008)

Один обходной путь (и не в моей голове, и это будет работать только при наличии разрешений на удаленном сервере):

  • на удаленном сервере есть хранимая процедура, которая создаст постоянную таблицу с именем, основанным на параметре IN
  • удаленная хранимая процедура запускает запрос, а затем вставляет результаты в эту таблицу
  • Затем вы выполняете локальный запрос к этой таблице, выполняя любые объединения с любыми необходимыми локальными таблицами
  • Вызовите другую хранимую процедуру на удаленном сервере, чтобы удалить удаленную таблицу, когда вы закончите

Не идеал, но возможный обходной путь.

1 голос
/ 03 апреля 2012

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

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

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

1 голос
/ 03 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...