执行DB2荣获i系列存储的过程从一个SQL2005年链接的服务器
-
11-07-2019 - |
题
我试图执行一个存储procedured从一个链接的数据库中MS SQL2005年。链接的数据库是一个数据库db2在一个荣获i系列服务器。我用荣获i系列IBMDASQL服务提供商。我能够查询所存储的过程没有问题,使用一个简单的vbscript和ado.当我试图执行相同的储存过程中查询分析SQL服务器上,我从来没有看到任何结果。查询分析器显示'执行的命令',当我执行的选择*在临时表,不值出现。我在做什么错误?????谢谢!
--代码查询分析如下--
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...仍然没有运气:(
宣布@TSQL varchar(8000) 宣布@emailToAddress varchar(50) 宣布@emailFromAddress varchar(50) 设置@emailToAddress='customer.service@company.com' 设置@emailFromAddress='customer@gmail.com' 设置@TSQL='SELECT*from OPENQUERY(MAM400,"呼abicqual.VP_GETCCEPGMID(""'+@emailToAddress+ ""', ""' + @emailFromAddress+ """ + ')"' + ')' 印@TSQL EXEC(@TSQL)
-输出如下-- SELECT*from OPENQUERY(MAM400,'叫abicqual.VP_GETCCEPGMID("customer.service@company.com","customer@gmail.com")') Msg7357,16级,国家2,第1行 无法处理的对象"呼abicqual.VP_GETCCEPGMID('customer.service@company.com','customer@gmail.com')".OLE DB"IBMDASQL"链接服务器"MAM400"表明对象不列或目前的用户不具有的权限,对象。
解决方案
原来,有许多的与我用的是IBMDASQL提供商的问题。不管你信不信它更快,更可靠的使用Microsoft OLE DB提供程序的ODBC驱动程序。创建与此提供一个新的链接服务器后,我所有的SQL较早尝试的工作正常。 干杯!
其他提示
我正在使用 Microsoft DB2OLEDB 提供程序,该提供程序作为 SQL 2005 - 2006 年 4 月功能包的一部分提供。它也是主机集成服务的一部分。它使用 DRDA(Oracle 风格)协议连接到 AS/400。
您可以单独下载它,但它只能安装在 SQL 标准、企业或开发人员(非 Express)上。
我还发现构建要在 DB2/400 机器上运行的完整查询,然后将其包装在 VARCHAR(MAX) 字符串中,其中还包括“SELECT * FROM OPENQUERY (--linkedservername--,--DB2/ 400 query with params--)”,然后使用 sp_execute 或 EXEC 命令返回最佳结果。
甚至可以将 RPG 代码包装在 DB2/400 SQL 过程中,然后从 MS SQL Server 调用它们(带参数),并将任何结果集作为 MS SQL 表返回。
呼叫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
解决方案是增加周围的调用语句括号。你仍然无法虽然选择成SQL服务器端的表,除非你已经安装了分布式事务的支持。我不知道为什么它需要一个交易,但它不会工作,除非你有这个设置。
EXEC( '{CALL abicqual.VP_GETCCEPGMID(?,?)}',@emailToAddress,@emailFromAddress)AT MAM400