DetailPage-MSS-KB

知识库

文章编号: 269011 - 最后修改: 2007年6月5日 - 修订: 3.2

 

本页

症状

存储的过程具有 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 )
    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) 
    					

这篇文章中的信息适用于:
  • Microsoft SQL Server 6.5 标准版
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
关键字: 
kbmt kbbug kbdatabase kbpending KB269011 KbMtzh
机器翻译机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 269011  (http://support.microsoft.com/kb/269011/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
其他支持选项
Microsoft Community 支持论坛
直接联系我们
查找 Microsoft 认证合作伙伴
Microsoft 商店