2

我正在尝试从 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、第1行无法处理对象“CALL abicqual.VP_GETCCEPGMID('customer.service@company.com', 'customer@gmail.com')”。链接服务器“MAM400”的 OLE DB 提供程序“IBMDASQL”指示该对象没有列或当前用户对该对象没有权限。

4

5 回答 5

2

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

于 2008-11-30T19:43:28.730 回答
1

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

于 2011-08-18T09:54:06.203 回答
0

尝试使用OPENQUERY此博客文章显示了将变量传递到 OPENQUERY 语句的示例。

于 2008-11-30T17:19:22.500 回答
0

通过链接服务器调用 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
于 2009-09-23T08:17:31.427 回答
0

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

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

于 2012-06-26T12:44:32.330 回答