2012-10-16 2 views
0

varchar 열에서 숫자 필드를 추출해야하는 쿼리가 있습니다. 일부 문을 대체하고 하위 문을 select 문을 및 bigint 다 잘 작동하지만 캐스팅 할 때이 동일한 캐스트를 사용할 때 오류가 발생합니다 'bigint 데이터 형식 varchar 변환 오류'. 어떻게 가능합니까?캐스팅 오류

select CAST(
     case when CHARINDEX('/',f.BML,1)>0 
      then substring(replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') ,1,CHARINDEX('/',BML,1)-1) 
     else replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') 
     end as bigint) 
from TableN n join TableO o on 
    n.Id=o.Id 
    join TableF f on 
     f.OId=o.OId and 
     substring(cast(n.RJ as varchar(10)),1,3)=substring(CAST(f.MT AS varchar(10)),1,3) and 
    CAST(
     case when CHARINDEX('/',f.BML,1)>0 then substring(replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') ,1,CHARINDEX('/',f.BML,1)-1) 
     else replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') 
     end as bigint) =n.mbr 
order by n.Ident 
+0

'bigint'로 변환 할 수없는'varchar' 열에 값이 있다고 생각합니다. –

+0

@Mikael Eriksson하지만 어떻게 똑같은 캐스트가 select 문에서 통과 할 수 있습니까? 동일한 예외가 발생합니다. – Marka

+0

오류를 일으키는 행을 필터링하는 where 절이 있습니까? – Fred

답변

2

본인이 언급 한대로 조건을 평가하는 순서에는 아무런 보장이 없습니다. 당신이 그렇다면 :

f.OId=o.OId and 
    substring(cast(n.RJ as varchar(10)),1,3)=substring(CAST(f.MT AS varchar(10)),1,3) and 
CAST(
    case when CHARINDEX('/',f.BML,1)>0 then substring(replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') ,1,CHARINDEX('/',f.BML,1)-1) 
    else replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') 
    end as bigint) =n.mbr 

그리고 하나 f.OId=o.OId 또는 substring(cast(n.RJ as varchar(10)),1,3)=substring(CAST(f.MT AS varchar(10)),1,3)bigint로 전환 할 수있는 것이 아니다 BML의 값으로 행을 제거한다, 그 변환을 시도하지 않는다는 보장은 없습니다.


당신은 하위 쿼리 또는 CTE에 나쁜 BML 값을 제거해야 필터를 이동을 시도 할 수 있지만, 여전히 쿼리 최적화가 원인이 여전히 하위 쿼리에 아래로 변환 연산자를 밀어하지 않는다고 보장 할 수 없습니다 오류.

이 문제를 해결하는 유일한 방법은 쿼리를 두 부분으로 나눠서 첫 번째 쿼리에서 변환 할 수없는 값을 제거하고이 쿼리의 결과를 임시 테이블/테이블 변수에 배치하는 것입니다. 그런 다음이 임시 테이블을 사용하여 쿼리의 두 번째 절반을 작성하십시오.

+0

임시 테이블로 이동하는 방법에 대해 생각했지만 쿼리가 복잡해졌습니다. 이것은 중복 데이터를 찾는 데 필요한 일회성 쿼리입니다. 음, 나는 다른 방법이 없다고 생각합니다. 어쨌든 고맙습니다. – Marka