我正在尝试从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”表示该对象没有列,或者当前用户没有该对象的权限。
答案 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)
尝试使用OPENQUERY。 This 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