注意: 錯誤 22018"的字元值無效的轉換規格 」 與 SQL Server 6.5

文章翻譯 文章翻譯
文章編號: 269011 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

當 ODBC API 作為這類 SQLExecute 呼叫具有 sp_getbindtoken 的呼叫,或是所引發觸發程序有對 sp_getbindtoken 呼叫的預存程序時,您可能會看到下列錯誤訊息:
DIAG [22018] [Microsoft] [ODBC SQL Server 驅動程式] 無效字元的轉換規格 (0) 的值
SQLExecute 傳回 SQL_SUCCESS_WITH_INFO,但是報告上述的錯誤。

其他可行方案

移除對 sp_getbindtoken 系統預存程序呼叫或消除輸出參數。

狀況說明

Microsoft 已確認這是 SQL Server 6.5 內有問題。

與 SQL Server 7.0 或 SQL Server 2000 不會發生這個錯誤。

其他相關資訊

僅與 SQL Server 6.5 透過 5a 包括 Service Pack 1 就會發生這個錯誤。當預存程序從 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. 執行下列 SQL 指令碼,isql 內。它應該會成功,並將資料列插入測試表格 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 測試工具
    	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月5日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
關鍵字:?
kbmt kbbug kbdatabase kbpending KB269011 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:269011
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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