Error: Error 22018 "carácter no válido valor para especificación cast" con SQL Server 6.5

Seleccione idioma Seleccione idioma
Id. de artículo: 269011 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando una API de ODBC funciona como llamadas a SQLExecute un procedimiento almacenado que tiene una llamada a sp_getbindtoken o que activa un desencadenador que tiene una llamada a sp_getbindtoken , puede ver el mensaje de error siguientes:
DIAG [22018] [Microsoft] [ODBC SQL Server Driver] valor de carácter no válido para especificación cast (0)
SQLExecute devuelve SQL_SUCCESS_WITH_INFO pero informa del error anterior.

Solución

Quite la llamada al procedimiento almacenado del sistema sp_getbindtoken o eliminar los parámetros de salida.

Estado

Microsoft ha confirmado que trata de un problema en SQL Server 6.5.

Este error no ocurre con SQL Server 7.0 o SQL Server 2000.

Más información

Este error se produce sólo con SQL Server 6.5, incluidos los Service Pack 1 mediante 5a. Este error no se produce cuando el procedimiento almacenado se llama desde isql o no tiene parámetros de salida.

Cuando se le llama desde una aplicación ODBC, la ejecución del procedimiento almacenado devuelve un valor devuelto que indica éxito, pero genera este error y no pasa volver los parámetros de salida. La llamada a la API ODBC SQLExecute devuelve SQL_SUCCESS_WITH_INFO y el anterior mensaje de error.

Pasos para reproducir este comportamiento

  1. Crear una tabla, un procedimiento almacenado y un desencadenador en la base de datos pubs con la siguiente secuencia de comandos SQL:
    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. Ejecute la siguiente secuencia de comandos SQL dentro de isql . Debe tener éxito y insertar una fila en la tabla de prueba, 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. Llame al mismo procedimiento almacenado desde una aplicación ODBC utilizando el código de ejemplo siguiente. También se puede reproducir el mismo error mediante la herramienta ODBC Test llamando a las funciones se muestra en la misma secuencia.
    	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. Resultados del paso anterior en el estado SQL 22018 y "valor de carácter no válido para especificación cast" mensaje con un código de retorno de SQL_SUCCESS_WITH_INFO. Siguiente es un registro de seguimiento ODBC de ejemplo:
    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) 
    					

Propiedades

Id. de artículo: 269011 - Última revisión: martes, 05 de junio de 2007 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
Palabras clave: 
kbmt kbbug kbdatabase kbpending KB269011 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 269011

Enviar comentarios

 

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