SQL 2005リンクサーバーからDB2 iSeriesストアドプロシージャを実行する
-
11-07-2019 - |
質問
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テーブルとして結果セットを返すことも可能です。
リンクサーバー経由で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