2008-11-30 102 views
2

我試圖從MS SQL 2005中的鏈接數據庫執行存儲過程。鏈接數據庫是iseries服務器上的db2數據庫。我正在使用iSeries IBMDASQL服務提供程序。我能夠使用簡單的vbscript和ado查詢存儲過程而不會出現問題。當我嘗試在SQL Server上的查詢分析器中執行相同的存儲過程時,我從來沒有看到任何結果。查詢分析器總是顯示'執行命令',並且當我在臨時表上執行select *時,不會顯示任何值。我究竟做錯了什麼????? 謝謝!從SQL 2005鏈接服務器執行DB2 iSeries存儲過程

從查詢分析器--code below--

DECLARE @emailToAddress   char(50) 
DECLARE @emailFromAddress  char(50) 

set @emailToAddress = '[email protected]' 
set @emailFromAddress = '[email protected]' 

If Object_ID('tempdb..#tmpResultTbl') Is Not Null 
    Drop Table #tmpResultTbl 

Create Table #tmpResultTbl 
(
OUTPGMID Char(150)) 

--SET FMTONLY Off 
Set NoCount On 
Insert Into #tmpResultTbl 
EXEC ('CALL abicqual.VP_GETCCEPGMID(?, ?) ', @emailToAddress, @emailFromAddress) AT MAM400 

Select * From #tmpResultTbl 

更新: 這裏是更新的代碼使用OPENQUERY ...仍然沒有運氣:(

DECLARE @TSQL VARCHAR(8000) DECLARE @emailToAddress VARCHAR(50) DECLARE @emailFromAddress VARCHAR(50) SET @emailToAddress = '[email protected]' SET @emailFromAddress = '[email protected]' SET @TSQL =「SELECT *從OPENQUERY(MAM 400,''CALL abicqual.VP_GETCCEPGMID('''''+ @emailToAddress +''''','''''+ @emailFromAddress +''''''+')'''+')' 打印@TSQL EXEC(@TSQL)

--output below-- SELECT * FROM OPENQUERY(MAM400, 'CALL abicqual.VP_GETCCEPGMID(' '[email protected]'」, '' 客戶@ gmail的.com'')') Msg 7357,Level 16,State 2,Line 1 無法處理對象「CALL abicqual.VP_GETCCEPGMID('[email protected]','[email protected]')」。鏈接服務器「MAM400」的OLE DB提供程序「IBMDASQL」表示該對象沒有列或當前用戶沒有該對象的權限。

回答

2

原來我使用的IBMDASQL提供程序有很多問題。相信與否使用Microsoft OLE DB Provider for ODBC Drivers更快,更可靠。在用這個提供程序創建一個新的鏈接服務器之後,我以前的所有sql嘗試都正常工作。 乾杯!

0

調用Oracle過程(功能)通過鏈接服務器並獲取其結果(返回值)

 
--input parameters p1, p2, p3 
declare @SQL nvarchar(1000) 
declare @param nvarchar(100) 
declare @result varchar(20) -- numbers may cause data type error 

-- (...custom actions, i.e. insert to local table) 

set @SQL = N'set @result = (select * from openquery(myLinkedServer, ''select OwnerName.Function_Insert(' + cast(@p1 as varchar) + ', ' + cast(@p1 as varchar) + ', ' + cast(@p3 as varchar) + ') from dual''))' 
set @param = '@result varchar output' 
EXEC sp_executesql @SQL, @param, @result output 

if @result '0' goto ERROR 

-- (...custom actions) 

return 1 -- OK 

ERROR: 
-- (...custom actions, i.e. delete from local table with(rowlock)) 
return 0 -- KO 
1

我使用的是微軟DB2OLEDB提供其可作爲SQL 2005的功能包的一部分 - 四月它也是主機集成服務的一部分。它使用DRDA(Oracle樣式)協議掛接到AS/400。

您可以單獨下載它,但它只會安裝在SQL標準,企業或開發人員(而不是表達)。

我還發現構建完整的查詢,我想在DB2/400框中運行,然後將其包裝在VARCHAR(MAX)字符串中,該字符串還包含「SELECT * FROM OPENQUERY(--linkedservername--, --DB2/400帶參數的查詢 - )「,然後使用sp_execute或EXEC命令返回最佳結果。

甚至可以在DB2/400 SQL過程中包裝RPG代碼,然後從MS SQL Server調用它們(使用參數),並將任何結果集作爲MS SQL表返回。

0

解決方法是在call語句中添加括號。您仍然無法在SQL Server端選擇表格,除非您已經安裝了對分佈式事務的支持。我不確定爲什麼它需要一個交易,但它不會工作,除非你有這個設置。 ('{CALL abicqual.VP_GETCCEPGMID(?,?)}',@emailToAddress,@emailFromAddress)AT MAM400

相關問題