Erro: Erro 22018 "carácter inválido valor para especificação de conversão" com o SQL Server 6.5

Traduções de Artigos Traduções de Artigos
Artigo: 269011 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando uma API de ODBC funcionar como chamadas SQLExecute um procedimento armazenado que tem uma chamada para sp_getbindtoken ou que é accionado um accionador que tenha uma chamada para sp_getbindtoken , poderá ver a seguinte mensagem de erro:
DIAG [22018] [Microsoft] [ODBC SQL Server controlador] valor de carácter inválido para especificação de conversão (0)
SQLExecute devolve SQL_SUCCESS_WITH_INFO mas comunica o erro acima.

Como contornar

Remova a chamada de procedimento armazenado do sistema sp_getbindtoken ou eliminar os parâmetros de saída.

Ponto Da Situação

Microsoft confirmou que este problema existe no SQL Server 6.5.

Este erro não ocorre com o SQL Server 7.0 ou SQL Server 2000.

Mais Informação

Este erro ocorre apenas com o SQL Server 6.5, incluindo Service Packs 1 através de 5a. Este erro não ocorre quando o procedimento armazenado é chamado a partir isql ou tiver sem parâmetros de saída.

Quando chamado a partir de uma aplicação de ODBC, a execução do procedimento armazenado devolve um valor devolvido indicando êxito, mas gera este erro e não passar novamente os parâmetros de saída. A chamada de API de ODBC SQLExecute devolve SQL_SUCCESS_WITH_INFO e a mensagem de erro acima.

Passos para reproduzir o comportamento

  1. Criar uma tabela, um procedimento armazenado e um accionador na base de dados Pubs utilizando o seguinte script de 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. Execute o seguinte script SQL dentro de isql . Deverá ser bem sucedido e inserir uma linha na tabela de teste, 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. Chamar o procedimento armazenado mesmo a partir de uma aplicação de ODBC utilizando o seguinte código de exemplo. Também pode ser reproduzido o mesmo erro utilizando a ferramenta ODBC teste chamando as funções mostradas na mesma sequência.
    	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. O passo acima resulta no estado SQL 22018 e mensagem de "valor de carácter inválido para especificação de conversão" com um código de retorno de SQL_SUCCESS_WITH_INFO. Segue-se um registo de rastreio ODBC do exemplo:
    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) 
    					

Propriedades

Artigo: 269011 - Última revisão: 5 de junho de 2007 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
Palavras-chave: 
kbmt kbbug kbdatabase kbpending KB269011 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 269011

Submeter comentários

 

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