DetailPage-MSS-KB

기술 자료

기술 자료: 269011 - 마지막 검토: 2007년 6월 5일 화요일 - 수정: 3.2

 

이 페이지에서

현상

ODBC API 함수 호출이 sp_getbindtoken 수 있거나 sp_getbindtoken 호출하여 트리거를 발생시키는 저장된 프로시저를 같은 SQLExecute 호출을 때 다음 오류 메시지가 나타날 수 있습니다.
[22018] [Microsoft] [ODBC SQL Server 드라이버] DIAG 잘못된 문자 값을 캐스트 사양의 (0)
SQLExecute SQL_SUCCESS_WITH_INFO 반환하지만 위의 오류를 보고합니다.

해결 과정

sp_getbindtoken 시스템 저장 프로시저에 대한 호출을 제거하거나 출력 매개 변수를 제거하십시오.

현재 상태

Microsoft는 이 SQL Server 6.5 문제를 확인했습니다.

SQL Server 7.0 또는 SQL Server 2000이 이 오류가 발생하지 않습니다.

추가 정보

이 오류는 5a 통해 서비스 팩 1을 포함하여 SQL Server 6.5를 사용하는 경우에만 발생합니다. isql 에서 저장된 프로시저를 호출하거나 출력 매개 변수가 없는 경우 이 오류가 발생하지 않습니다.

ODBC 응용 프로그램에서 호출되는 경우 저장된 프로시저 실행의 성공을 나타내는 반환 값을 반환하지만 이 오류를 생성하고 다시 출력 매개 변수를 전달하지 않습니다. ODBC API 호출은 SQLExecute SQL_SUCCESS_WITH_INFO 위의 오류 메시지를 반환합니다.

문제를 재현하기 위한 단계

  1. 다음 SQL 스크립트를 사용하여 Pubs 데이터베이스의 테이블, 저장된 프로시저 및 트리거를 만드는:
    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. isql 안에 다음 SQL 스크립트를 실행하십시오. 성공할 수 및 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. 다음 예제 코드를 사용하여 ODBC 응용 프로그램에서 같은 저장된 프로시저를 호출하십시오. 동일한 시퀀스가 표시된 함수를 호출하여 ODBC 테스트 도구를 사용하여 동일한 오류 또한 재현할 수 있습니다.
    	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. 위의 단계는 SQL 상태 22018, SQL_SUCCESS_WITH_INFO의 반환 코드 사용하여 "사양에 대한 잘못된 문자 값" 메시지가 발생합니다. 다음 샘플에서는 ODBC 추적 로그에 있습니다:
    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) 
    					

본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
키워드: 
kbmt kbbug kbdatabase kbpending KB269011 KbMtko
기계 번역된 문서기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store
소기업이 아닙니까?
다음에서 팔로우하십시오.