从SQL 2005链接服务器执行DB2 iSeries存储过程

时间:2008-11-30 16:42:30

标签: sql-server-2005 db2 linked-server ibm-midrange

我正在尝试从MS SQL 2005中的链接数据库执行存储过程。链接数据库是iseries服务器上的db2数据库。我正在使用iSeries IBMDASQL服务提供程序。我可以使用简单的vbscript和ado查询存储过程而不会出现问题。当我尝试在SQL Server上的查询分析器中执行相同的存储过程时,我从未看到任何结果。查询分析器始终显示“命令已执行”,当我在临时表上执行select *时,不会显示任何值。我究竟做错了什么????? 谢谢!

- 来自下面的查询分析器的代码 -

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

set @emailToAddress = 'customer.service@company.com'
set @emailFromAddress = 'customer@gmail.com'

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 ='customer.service@company.com' SET @emailFromAddress ='customer@gmail.com' SET @TSQL ='SELECT * FROM OPENQUERY(MAM400,''CALL abicqual.VP_GETCCEPGMID('''''+ @emailToAddress +''''','''''+ @emailFromAddress +''''''+ ')'''+')' 打印@TSQL 执行(@TSQL)

- 输出低于 - SELECT * FROM OPENQUERY(MAM400,'CALL abicqual.VP_GETCCEPGMID(''customer.service@company.com'',''customer@gmail.com'')') Msg 7357,Level 16,State 2,Line 1 无法处理对象“CALL abicqual.VP_GETCCEPGMID('customer.service@company.com','customer@gmail.com')”。链接服务器“MAM400”的OLE DB提供程序“IBMDASQL”表示该对象没有列,或者当前用户没有该对象的权限。

5 个答案:

答案 0 :(得分:2)

事实证明,我使用的IBMDASQL提供程序存在许多问题。信不信由你使用Microsoft OLE DB Provider for ODBC Drivers更快更可靠。使用此提供程序创建新的链接服务器后,我之前的所有SQL尝试都正常工作。 干杯!

答案 1 :(得分:1)

我正在使用Microsoft DB2OLEDB提供程序,该提供程序作为SQL 2005 Feature Pack的一部分提供 - 2006年4月。它也是Host Integration Services的一部分。它使用DRDA(Oracle风格)协议挂接到AS / 400。

您可以单独下载它,但它只能安装在SQL标准,企业或开发人员(非快递)上。

我还发现构建我想要在DB2 / 400盒子上运行的完整查询,然后将其包装在VARCHAR(MAX)字符串中,该字符串还包括“SELECT * FROM OPENQUERY(--linkedservername - , - -DB2 / 400查询与params--)“然后使用sp_execute或EXEC命令返回最佳结果。

甚至可以在DB2 / 400 SQL过程中包装RPG代码,然后从MS SQL Server中调用它们(使用params)并将任何结果集作为MS SQL表返回。

答案 2 :(得分:0)

尝试使用OPENQUERYThis blog posting显示了将变量传递给OPENQUERY语句的示例。

答案 3 :(得分: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

答案 4 :(得分:0)

解决方案是在call语句周围添加括号。除非您已经安装了对分布式事务的支持,否则您仍然无法在SQL Server端选择表。我不确定为什么它需要一个交易,但除非你有这个设置,否则它将无法运作。

EXEC('{CALL abicqual.VP_GETCCEPGMID(?,?)}',@ emailToAddress,@ emailFromAddress)AT MAM400