2

MS SQL 2005でリンクされたデータベースからストアドプロシージャを実行しようとしています。リンクされたデータベースは、iseriesサーバー上のdb2データベースです。iSeriesIBMDASQLサービスプロバイダーを使用しています。単純な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')」を処理できません。リンクサーバー"MAM400"のOLEDBプロバイダー"IBMDASQL"は、オブジェクトに列がないか、現在のユーザーにそのオブジェクトに対するアクセス許可がないことを示しています。

4

5 に答える 5

2

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

于 2008-11-30T19:43:28.730 に答える
1

Feature Pack for SQL 2005 - April 2006 の一部として入手できる Microsoft DB2OLEDB プロバイダーを使用しています。これは Host Integration Services の一部でもあります。DRDA (Oracle スタイル) プロトコルを使用して AS/400 に接続します。

個別にダウンロードできますが、SQL 標準、エンタープライズ、または開発者 (高速ではない) にのみインストールされます。

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

DB2/400 SQL プロシージャー内で RPG コードをラップし、MS SQL Server から (params を使用して) それらを呼び出し、結果セットを MS SQL テーブルとして返すことも可能です。

于 2011-08-18T09:54:06.203 に答える
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''))'
set @param ='@result varchar output'
EXEC sp_executesql @ SQL、@ param、@result出力

@result'0'の場合はERRORに移動します

-(...カスタムアクション)

戻る1-OK

エラー:
-(...カスタムアクション、つまり(rowlock)を使用してローカルテーブルから削除)
0を返す--KO
于 2009-09-23T08:17:31.427 に答える
0

解決策は、call ステートメントの周りに括弧を追加することです。ただし、分散トランザクションのサポートをインストールしていない限り、SQL Server 側でテーブルを選択することはできません。なぜトランザクションが必要なのかわかりませんが、これを設定しないと機能しません。

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

于 2012-06-26T12:44:32.330 に答える
0

OPENQUERYを使用してみてください。 このブログ投稿は、変数を OPENQUERY ステートメントに渡す例を示しています。

于 2008-11-30T17:19:22.500 に答える