現在オフラインです。再接続するためにインターネットの接続を待っています

[BUG] SQL Server 6.5 でエラー 22018 "キャストした文字コードが正しくありません" が表示される

現象
SQLExecute などの ODBC API 関数で sp_getbindtoken への呼び出しを行うストアド プロシージャ、または sp_getbindtoken への呼び出しを行うトリガが起動されるストアド プロシージャを呼び出したときに、次のエラー メッセージが表示されることがあります。
DIAG [22018] [Microsoft][ODBC SQL Server Driver]キャストした文字コードが正しくありません (0)
SQLExecute は SQL_SUCCESS_WITH_INFO を返しますが、上記のエラーが報告されます。
回避策
sp_getbindtoken システム ストアド プロシージャへの呼び出しを削除するか、または出力パラメータを使用しないようにします。
状況
マイクロソフトでは、この問題を SQL Server 6.5 の問題として認識しています。

このエラーは、SQL Server 7.0 および SQL Server 2000 では発生しません。
詳細
このエラーは、Service Pack 1 から 5a までを含む SQL Server 6.5 でのみ発生します。ストアド プロシージャが isql から呼び出される場合や、出力パラメータがない場合には発生しません。

ODBC アプリケーションから呼び出されると、ストアド プロシージャの実行によって成功を表す戻り値が返されますが、このエラーが生成され、出力パラメータは返されません。ODBC API 呼び出しの SQLExecute から SQL_SUCCESS_WITH_INFO と上記のエラー メッセージが返されます。

現象の再現手順

  1. 次の SQL スクリプトを使用して、Pubs データベースにテーブル、ストアド プロシージャ、およびトリガを作成します。
    create table emp_table (emp_id int primary key,                        emp_name varchar(80) not null )gocreate trigger TR_emp_table_ins on emp_tablefor insert asbegin    declare @token_value varchar(255)    exec master..sp_getbindtoken @token_value outputendgocreate procedure test_proc_one    @return_code int output,    @error_code int outputasbegin    declare @token_value varchar(255)    declare @max_emp_id int    select @return_code = 13    begin tran    select @max_emp_id = max(emp_id) from emp_table    if @max_emp_id is null    begin        select @max_emp_id = 1    end    else    begin        select @max_emp_id = @max_emp_id + 1    end    insert into emp_table values(@max_emp_id, 'John Doe')    if @@error <> 0    begin        raiserror('Insert into employee_list failed for emp_id %d', 16, -1, @max_emp_id)        rollback tran        select @return_code = -100        select @error_code = -200    end    else    begin        commit tran        select @return_code = 0        select @error_code = 2    endend /* procedure test_proc_one */ go					
  2. isql 内で次の SQL スクリプトを実行します。処理が成功し、テスト用のテーブル emp_table に行が挿入されます。
    declare @ret_value intdeclare @err_code intdeclare @string varchar(255)select @ret_value = 10select @err_code = 20exec test_proc_one @ret_value output, @err_code outputselect @string = 'test_proc_one set ret_value to ' + rtrim(convert(varchar(16), @ret_value))                 + ' and err_code to ' + rtrim(convert(varchar(16), @err_code))print @stringselect * from emp_table					
  3. 次のサンプル コードを使用して、同じストアド プロシージャを ODBC アプリケーションから呼び出します。ここに示された関数を同じ順序で呼び出すと、ODBC Test ツールを使用した場合も、同一のエラーを再現できます。
    	SQLRETURN rc;	SQLCHAR*  SQLStr = "{call test_proc_one(?,?)}";   	SQLINTEGER nReturnCode = SQL_NTS;	SQLINTEGER nErrorCode = SQL_NTS;	SQLINTEGER cbReturnCode = SQL_NTS;	SQLINTEGER cbErrorCode = SQL_NTS;	/* Prepare the statement, bind parameters, and execute the statement */ 	rc = SQLPrepare(hStmt, SQLStr, SQL_NTS);	rc = SQLBindParameter(hStmt, 1, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER, 		                    0, 0, &nReturnCode, 0, &cbReturnCode);	rc = SQLBindParameter(hStmt, 2, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER,		                    0, 0, &nErrorCode, 0, &cbErrorCode);	rc = SQLExecute(hStmt);	do {	   rc = SQLMoreResults(hStmt);	} while (rc != SQL_NO_DATA);					
  4. 上記の処理を実行すると、SQL 状態コード 22018 およびメッセージ "キャストした文字コードが正しくありません" がリターン コード SQL_SUCCESS_WITH_INFO と共に返されます。以下に、ODBC トレース ログの例を示します。
    mssamp          163:166	EXIT  SQLExecute  with return code 1 (SQL_SUCCESS_WITH_INFO)		HSTMT               0x00cc2158		DIAG [22018] [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (0) 					
22018
プロパティ

文書番号:269011 - 最終更新日: 06/19/2007 01:11:21 - リビジョン: 3.1

  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
  • kbbug kbdatabase kbpending KB269011
フィードバック