错误: 错误 22018"无效的字符值强制转换规范"与 SQL Server 6.5

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 269011
本文已归档。它按“原样”提供,并且不再更新。
症状
存储的过程具有 sp_getbindtoken 的调用或该触发了具有 sp_getbindtoken 调用 ODBC API 的正常工作如 [sql] [执行] 调用时, 您可能会看到以下错误消息:
诊断 [22018] [Microsoft] [ODBC SQL Server 驱动程序] 对于造型 (0) 的无效字符值
[sql] [执行] 返回 SQL_SUCCESS_WITH_INFO 但报告上述错误。
替代方法
移除 sp_getbindtoken 的系统存储过程调用或消除输出参数。
状态
Microsoft 已经确认这是 SQL Server 6.5 中的问题。

与 SQL Server 7.0 或 SQL Server 2000 不会发生此错误。
更多信息
仅使用 SQL Server 6.5,通过 5a 包括服务包 1 时出现此错误。该存储的过程从 isql 调用或没有输出参数时,不会发生此错误。

存储的过程执行调用来自 ODBC 应用程序时, 返回一个返回的值,该值指示成功,但它将产生此错误,不传递回输出参数。ODBC API 调用 [sql] [执行] 返回 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. 运行下面的 SQL 脚本,isql 内。它应当会成功,将行插入测试表 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 检验工具重现相同的错误
    	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

属性

文章 ID:269011 - 上次审阅时间:12/05/2015 21:07:17 - 修订版本: 3.2

Microsoft SQL Server 6.5 标准版, Microsoft Data Access Components 2.1, Microsoft Data Access Components 2.5

  • kbnosurvey kbarchive kbmt kbbug kbdatabase kbpending KB269011 KbMtzh
反馈