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

文書翻訳 文書翻訳
文書番号: 269011 - 対象製品
すべて展開する | すべて折りたたむ

目次

現象

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 )
    go
    
    create trigger TR_emp_table_ins on emp_table
    for insert as
    begin
        declare @token_value varchar(255)
        exec master..sp_getbindtoken @token_value output
    end
    go
    
    create procedure test_proc_one
        @return_code int output,
        @error_code int output
    as
    begin
        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
        end
    
    end /* procedure test_proc_one */ 
    go
    					
  2. isql 内で次の SQL スクリプトを実行します。処理が成功し、テスト用のテーブル emp_table に行が挿入されます。
    declare @ret_value int
    declare @err_code int
    declare @string varchar(255)
    
    select @ret_value = 10
    select @err_code = 20
    
    exec test_proc_one @ret_value output, @err_code output
    
    select @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 @string
    
    select * 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) 
    					

プロパティ

文書番号: 269011 - 最終更新日: 2007年6月19日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com