2013-04-01 3 views
0

나는이 질문을 모두 stackoverflow에서 보았지만 그 상황에 맞는 해결책이 많습니다. 내가 말할 수있는 한 독특한 상황이있는 것 같습니다. 내가 뭔가를 여기SQL 서버에서 varchar를 INT로 변환 할 때 문제가 발생했습니다.

set @MatchType = dbo.GetMatchType(@CAReturnCode,@CAErrorCodes) 

에 실패합니다이 SQL 문

use IST_CA_2_Batch_Conversion 
GO 
--T-SQL script to populate the Match type column 
declare @MatchType varchar(16), 
@PK varchar(500), 
@CAReturnCode VARCHAR(255), 
@CAErrorCodes VARCHAR(255) 

declare cursor1 cursor fast_forward for 
select 
["Ref#"], 
["Return Code"], 
["Error Codes"] 
from CACodes2MatchType 

open cursor1 
fetch next from cursor1 into @PK,@CAReturnCode,@CAErrorCodes 

while @@fetch_status = 0 
begin 

set @MatchType = dbo.GetMatchType(@CAReturnCode,@CAErrorCodes) 

update CACodes2MatchType 
set [Match Type] = @MatchType 
where ["Ref#"] = @PK 

fetch next from cursor1 into @PK,@CAReturnCode,@CAErrorCodes 
end 
close cursor1 
deallocate cursor1 

를 실행하고있는 GetMatchType 함수의 시작 코드 : 나는 오류를 얻을 것이다

-- Batch submitted through debugger:  
SQLQuery14.sql|6|0|C:\Users\b01642a\AppData\Local\Temp\~vs1C8E.sql 
CREATE FUNCTION [dbo].[GetMatchType](@CAReturnCode VARCHAR(255), @CAErrorCodes  
VARCHAR(255)) 
RETURNS VARCHAR(16) 
BEGIN 
    DECLARE @MatchType VARCHAR(16); 
    DECLARE @errorCodes TABLE(Pos INT, Code CHAR(2)); 
    DECLARE @country INT; -- 1 is US, 2 is Canada 
    DECLARE @numMinorChanges INT; 
    DECLARE @numMajorChanges INT; 
    DECLARE @numSingleCodes INT; 
    DECLARE @returnCode INT; 

    DECLARE @verified VARCHAR(16); 
    DECLARE @goodFull VARCHAR(16); 
    DECLARE @tentativeFull VARCHAR(16); 
    DECLARE @poorFull VARCHAR(16); 
    DECLARE @multipleMatch VARCHAR(16); 
    DECLARE @unmatched VARCHAR(16); 

    SET @verified = 'Verified'; 
    SET @goodFull = 'Good Full'; 
    SET @tentativeFull = 'Tentative Full'; 
    SET @poorFull = 'Poor Full'; 
    SET @multipleMatch = 'Multiple Match'; 
    SET @unmatched = 'Unmatched'; 

    SET @returnCode = CAST(@CAReturnCode AS INT); 

: 메시지 245, 수준 16, 상태 1, 줄 21 varchar 값 ' "1"'을 데이터 형식 int로 변환 할 때 변환하지 못했습니다.

이 오류는 내가 보여 주었다 코드 세그먼트의 마지막 줄에서 발생

SET @returnCode = CAST(@CAReturnCode AS INT); 

이 가정으로 동료에 의해 작성되었다 코드가 그를 위해 일했다한다. 일부 오류를 해결해야하지만이 오류는 디버그 할 수 없습니다. 많은 사람들이 dbo.split 함수를 만들 수 있다는 것을 알고 있습니다. 이 옵션이이 시나리오에서 도움이 될지 모르겠습니다. 나는 varchar에 @returnCode를 설정하고 @CAReturnCode에서 CAST를 제거하려고 시도했다. 결과적으로 디버거는 해당 행을 지나치게되지만 나머지 코드와 관련된 문제가 발생합니다. @CAReturnCode를 캐스팅하는 방법에 문제가 있다고 가정하고 있습니까? 어떤 도움이라도 대단히 감사 할 것입니다.

+0

CAST는 ANSI이고 Convert는 SQL에서만 사용됩니다. CONVERT를 사용할 수 있습니까? 조금 더 지능적이어서 변환 방법을 선택하십시오. –

+0

나는 그 총을 줬다. SET @returnCode = CONVERT (INT, @ CAReturnCode); 여전히 동일한 오류가 발생했습니다 – TaylorSmolik

답변

2

@CAReturnCode에 숫자가 아닌 문자가 포함되어있는 것이 문제입니다.

-- Msg 245, Level 16, State 1, Line 21 Conversion failed when converting the varchar value '"1"' to data type int. 

참조, 외부 따옴표 오류 메시지의 형식이지만, 내부 따옴표는 @CAReturnCode 값에 있습니다. 따라서 여기에있는 솔루션은 변수가 변환하기 전에 숫자 문자 만 포함하도록하는 것입니다. 따옴표가 유일한 가능성이 있다면, 당신은이 같은 신속하고 더러운 수정 수행 할 수 있습니다 더 많은 가능성이있는 경우

set @returnCode = cast(replace(@CAReturnCode, '"', '') as int) 

, 당신은 전화를 교체 복수 할 수있는, 또는 당신이 더 나은 문자 트리밍 기능을 만들 수를 그 한 번에 지정한 모든 문자를 제거합니다.

+0

Wonderful! 하루 종일 따옴표를 볼 때 쉽게 지나칠 수 있습니다. 고맙습니다. – TaylorSmolik

관련 문제