Как получить набор результатов с вызовами хранимых процедур на двух связанных серверах? - PullRequest
1 голос
/ 21 апреля 2010

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

У меня есть хранимая процедура sproc1 со следующим кодом, который вызывает другую процедуру sproc2 на связанном сервере.

SET @sqlCommand = 'INSERT INTO #tblTemp ( ModuleID, ParamID) ' +
'( SELECT * FROM OPENQUERY(' + @targetServer + ', ' +
'''SET FMTONLY OFF; EXEC ' + @targetDB + '.usr.sproc2 ' + @param + ''' ) )'

exec ( @sqlCommand )

Теперь в вызываемом sproc2 я снова вызываю третью процедуру sproc3 на другом связанном сервере, которая возвращает мой набор результатов.

SET @sqlCommand = 'EXEC ' + @targetServer +'.database.usr.sproc3 ' + @param
exec ( @sqlCommand )

Все это не работает, так как я получаю ошибку SQL 7391

Операция не может быть выполнена, поскольку поставщику OLE DB "% ls" для связанного сервера "% ls" не удалось начать распределенную транзакцию.

Я уже проверил подсказки к этой статье Microsoft , но безуспешно. Но, может быть, я могу изменить код в sproc1. Будет ли какая-то альтернатива временной таблице и открытому запросу?

Работает только вызов хранимых процедур с сервера A на B к C и возврат набора результатов (я часто делаю это в приложении). Но этот особый случай с временной таблицей и openquery не работает!

Или это просто невозможно, что я пытаюсь сделать? Статья о микросфте гласит:

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

Это мой случай?

PS: я не могу избежать архитектуры с тремя серверами.

1 Ответ

0 голосов
/ 22 апреля 2010

ОК, я мог бы решить это как-то.

Теперь я только что сделал это в sproc2, как в sproc1: я также использую временную таблицу и openquery в sproc2. Затем я делаю выбор на моей временной таблице.

Это работает даже без запуска msdtc, что было необходимо в версии выше. Единственное требование - иметь

SET FMTONLY OFF;
SET NOCOUNT ON;

в моем sproc2.

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