【问题标题】:Execute DB2 iSeries Stored Procedure from a SQL 2005 Linked Server从 SQL 2005 链接服务器执行 DB2 iSeries 存储过程
【发布时间】:2008-11-30 16:42:29
【问题描述】:

我正在尝试从 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的更新代码......仍然没有运气:(

声明@TSQL varchar(8000) 声明@emailToAddress varchar(50) 声明@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'')') 消息 7357,第 16 层,状态 2,第 1 行 无法处理对象“CALL abicqual.VP_GETCCEPGMID('customer.service@company.com', 'customer@gmail.com')”。链接服务器“MAM400”的 OLE DB 提供程序“IBMDASQL”表明该对象没有列或当前用户对该对象没有权限。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我正在使用 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 表返回。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          通过链接服务器调用oracle过程(函数)并获取其结果(返回值)

          --输入参数p1,p2,p3 声明@SQL nvarchar(1000) 声明@param nvarchar(100) 声明 @result varchar(20) -- 数字可能导致数据类型错误 -- (...自定义操作,即插入到本地表) 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''))' 设置@param = '@result varchar 输出' EXEC sp_executesql @SQL、@param、@result 输出 如果@result '0' 转到错误 -- (...自定义操作) 返回 1 -- 好的 错误: -- (...自定义操作,即使用 (rowlock) 从本地表中删除) 返回 0 -- KO

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-12-11
              • 1970-01-01
              • 1970-01-01
              • 2015-04-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多