質問

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を印刷 EXEC(@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 ')"を処理できません。 OLE DBプロバイダー" IBMDASQL"リンクサーバー" MAM400"オブジェクトに列がないか、現在のユーザーにそのオブジェクトに対する権限がないことを示します。

役に立ちましたか?

解決

使用していたIBMDASQLプロバイダーには多くの問題があることが判明しました。信じられないかもしれませんが、ODBCドライバー用のMicrosoft OLE DBプロバイダーを使用する方が高速で信頼性が高いです。このプロバイダーで新しいリンクサーバーを作成した後、以前のすべてのsqlの試行は適切に機能しました。 乾杯!

他のヒント

SQL 2005-2006年4月のFeature Packの一部として利用可能なMicrosoft DB2OLEDBプロバイダーを使用しています。これはHost Integration Servicesの一部でもあります。 DRDA(Oracleスタイル)プロトコルを使用してAS / 400にフックします。

個別にダウンロードできますが、SQL標準、エンタープライズ、または開発者にのみインストールされます(エクスプレスではありません)。

また、DB2 / 400ボックスで実行する完全なクエリを作成し、それを" SELECT * FROM OPENQUERY(--linkedservername--、 --paramsを使用したDB2 / 400クエリ-)"そして、sp_executeまたはEXECコマンドを使用すると、最良の結果が返されます。

DB2 / 400 SQLプロシージャ内でRPGコードをラップし、MS SQL ServerからRPGコードを(パラメーターを使用して)呼び出し、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 Server側のテーブルを選択することはできません。トランザクションが必要な理由はわかりませんが、これを設定しないと機能しません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top