我试图执行一个存储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 表返回。

尝试使用 OPENQUERY. 这个博客 示例的通过变成一个OPENQUERY发言。

呼叫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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top