DetailPage-MSS-KB

Knowledge Base

Artikel-ID: 269011 - Geändert am: Dienstag, 5. Juni 2007 - Version: 3.2

 

Auf dieser Seite

Problembeschreibung

Wenn eine ODBC-API funktioniert z. B. SQLExecute Aufrufe eine gespeicherte Prozedur mit einen Aufruf von Sp_getbindtoken oder, die einen Trigger, der einen Aufruf von Sp_getbindtoken hat auslöst, wird möglicherweise die folgenden Fehlermeldung angezeigt:
DIAG [22018] [Microsoft] [ODBC SQL Server Driver] Zeichenwert für Umwandlungsspezifikation (0) ist ungültig
SQLExecute SQL_SUCCESS_WITH_INFO zurückgegeben jedoch meldet den oben genannten Fehler.

Abhilfe

Entfernen des Aufrufs der gespeicherten Systemprozedur Sp_getbindtoken oder beseitigen die Ausgabeparameter.

Status

Microsoft hat ein Problem in SQL Server 6.5 dazu bestätigt.

Dieser Fehler tritt bei SQL Server 7.0 oder SQL Server 2000 nicht auf.

Weitere Informationen

Dieser Fehler tritt nur mit SQL Server 6.5, Service Pack 1 über 5a einschließlich. Dieser Fehler tritt nicht auf, wenn die gespeicherte Prozedur von Isql aufgerufen wird oder keine Ausgabeparameter hat.

Wenn aus einer ODBC-Anwendung aufgerufen wird, gibt die Ausführung der gespeicherten Prozedur einen Rückgabewert, Erfolg zurück, aber wird dieser Fehler erzeugt und übergibt nicht wieder die Ausgabeparameter. Der ODBC API-Aufruf SQLExecute zurückgegeben SQL_SUCCESS_WITH_INFO und oben Fehlermeldung.

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie eine Tabelle, einer gespeicherten Prozedur und ein Trigger in der Pubs-Datenbank mithilfe des folgenden SQL-Skripts:
    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. Führen Sie das folgende SQL-Skript in Isql . Sollte erfolgreich sein und eine Zeile in der Tabelle "Test" Emp_table einfügen:
    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. Rufen Sie die gleiche gespeicherte Prozedur aus einer ODBC-Anwendung mit dem folgenden Beispielcode. Der gleiche Fehler kann auch mit dem ODBC Test-Tool durch den Aufruf von dargestellten Funktionen in derselben Reihenfolge reproduziert werden.
    	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. Die oben genannten Schritt Ergebnisse in der SQL-Status 22018 und "Zeichenwert für Umwandlungsspezifikation ist ungültig" Nachricht mit einem Rückgabecode von SQL_SUCCESS_WITH_INFO. Es folgt ein Beispiel ODBC-Protokoll der Ablaufverfolgung:
    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) 
    					

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
Keywords: 
kbmt kbbug kbdatabase kbpending KB269011 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 269011  (http://support.microsoft.com/kb/269011/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Freigeben
Weitere Supportoptionen
Microsoft Community-Supportforen
Kontaktieren Sie uns direkt
Zertifizierten Partner finden
Microsoft Store