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

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 269011
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando uma API ODBC funcionar como chamadas SQLExecute um procedimento armazenado que tem uma chamada para sp_getbindtoken ou que aciona um disparador que tenha uma chamada para sp_getbindtoken , você verá a seguinte mensagem de erro:
DIAG [22018] [Microsoft] [ODBC SQL Server Driver] valor de caractere inválido para especificação de conversão (0)
SQLExecute retorna SQL_SUCCESS_WITH_INFO, mas relata o erro acima.
Como Contornar
Remover a chamada para sp_getbindtoken procedimento armazenado do sistema ou eliminar os parâmetros de saída.
Situação
A Microsoft confirmou que este é um problema no SQL Server 6.5.

Este erro não ocorre com o SQL Server 7.0 ou SQL Server 2000.
Mais Informações
Este erro ocorre apenas com SQL Server 6.5, inclusive Service Packs 1 através de 5a. Este erro não ocorre quando o procedimento armazenado é chamado de isql ou não tem nenhum parâmetro de saída.

Quando chamado de um aplicativo ODBC, a execução do procedimento armazenado retorna um valor de retorno indicando êxito, mas ele gera este erro e não passa novamente os parâmetros de saída. A chamada de API ODBC SQLExecute retorna SQL_SUCCESS_WITH_INFO e a mensagem de erro acima.

Etapas para reproduzir o problema

  1. Criar uma tabela, um procedimento armazenado e um disparador no banco de dados Pubs usando o seguinte script SQL:
    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. Execute o seguinte script SQL dentro isql . Ele deve ser bem-sucedida e inserir uma linha na tabela de teste, 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. Chame o mesmo procedimento armazenado de um aplicativo ODBC usando o seguinte código de exemplo. O mesmo erro também pode ser reproduzido usando a ferramenta teste ODBC chamando as funções mostradas na mesma seqüê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. A etapa acima resulta no estado SQL 22018 e a mensagem "valor de caractere inválido para especificação de conversão" com um código de retorno de SQL_SUCCESS_WITH_INFO. Este é um log de rastreamento ODBC 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) 					
22018

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 269011 - Última Revisão: 12/05/2015 21:07:13 - Revisão: 3.2

Microsoft SQL Server 6.5 Standard Edition, Microsoft Data Access Components 2.1, Microsoft Data Access Components 2.5

  • kbnosurvey kbarchive kbmt kbbug kbdatabase kbpending KB269011 KbMtpt
Comentários