BOGUE : Erreur 22018 "caractère non valide valeur pour la spécification de cast» avec SQL Server 6.5

Traductions disponibles Traductions disponibles
Numéro d'article: 269011 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsqu'une API de ODBC fonctionne comme les appels de SQLExecute une procédure stockée qui est un appel à sp_getbindtoken ou qui déclenche un trigger qui a un appel à sp_getbindtoken, message d'erreur suivant peut s'afficher :
DIAG [22018] [Microsoft] [pilote ODBC SQL Server] valeur de caractère non valide pour la spécification de cast (0)
SQLExecute renvoie SQL_SUCCESS_WITH_INFO mais signale l'erreur ci-dessus.

Contournement

Supprimez l'appel à la procédure stockée du système sp_getbindtoken ou éliminer les paramètres de sortie.

Statut

Microsoft a confirmé l'existence de ce problème dans SQL Server 6.5.

Cette erreur ne se produit pas avec SQL Server 7.0 ou SQL Server 2000.

Plus d'informations

Cette erreur se produit uniquement avec SQL Server 6.5, y compris les Service Packs 1 par le biais de 5 a. Cette erreur ne se produit pas lorsque la procédure stockée est appelée à partir de isql ou n'a aucun paramètre de sortie.

Lorsqu'elle est appelée à partir d'une application ODBC, l'exécution de la procédure stockée renvoie une valeur de retour indiquant le succès, mais il génère cette erreur et ne passe pas rétablir les paramètres de sortie. L'appel d'ODBC API SQLExecDirect renvoie SQL_SUCCESS_WITH_INFO et message d'erreur ci-dessus.

Procédure pour reproduire le problème

  1. Créer une table, une procédure stockée et un déclencheur dans la base de données pubs à l'aide du script SQL suivant :
    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. Exécutez le script SQL suivant à l'intérieur de isql. Il doit être réussie et insérer une ligne dans la table de test, 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. Appeler la même procédure stockée à partir d'une application ODBC à l'aide du code exemple suivant. Le même message d'erreur peut également être reproduit à l'aide de l'outil ODBC test en appelant les fonctions affichées dans la même séquence.
    	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. Les résultats étape ci-dessus dans l'état SQL 22018 et le message "valeur de caractère non valide pour la spécification de cast" avec code retour SQL_SUCCESS_WITH_INFO. Voici un journal de suivi ODBC exemple :
    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) 
    					

Propriétés

Numéro d'article: 269011 - Dernière mise à jour: mardi 5 juin 2007 - Version: 3.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 6.5 Édition Standard
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
Mots-clés : 
kbmt kbbug kbdatabase kbpending KB269011 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 269011
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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