2010-04-21 63 views
1

我有一個問題,填充一個臨時表與來自鏈接服務器上的過程調用的結果集,其中再次調用另一個服務器上的過程。如何通過兩臺鏈接的服務器獲取存儲過程調用的結果集?

我有一個存儲過程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) 

整個事情doen't工作,我得到一個SQL錯誤7391

的操作,因爲OLE DB提供程序 「%ls」 的鏈接服務器 「%1!」 是無法進行無法開始分佈式事務。

我已經檢查了這個提示microsoft article,但沒有成功。 但也許,我可以更改sproc1中的代碼。會有替代臨時表和開放查詢嗎?

只是調用存儲過程從服務器A到B到C並返回結果集正在工作(我經常在應用程序中這樣做)。但是,臨時表和openquery的這種特殊情況不起作用!

還是隻是不可能我想做什麼? microsft文章指出:

檢查您在目標服務器上引用的對象。如果它是一個視圖或一個存儲過程,或者導致觸發器執行,請檢查它是否隱式引用另一個服務器。如果是這樣,第三臺服務器是問題的根源。直接在第三臺服務器上運行查詢。如果您無法直接在第三個服務器上運行查詢,則問題實際上不在鏈接的服務器查詢中。首先解決潛在的問題。

這是我的情況嗎? PS:我無法避開三臺服務器的體系結構。

回答

0

好的,我可以以某種方式解決它。

現在我剛剛在sproc2中做了像sproc1一樣的工作:我還在sproc2中使用臨時表和openquery。然後我在臨時表上做一個選擇。

即使沒有啓動msdtc,這在上述版本中也是有必要的。 只有要求是有

SET FMTONLY OFF; 
SET NOCOUNT ON; 

在我的sproc2。

相關問題