2014-08-29 3 views
0

varchar 열 'Column 0'이있는 테이블이 "Table1_201403"입니다. 자, 아래의 쿼리 Master_Table2이 테이블에서 필요한 데이터를 삽입 할 -이 작업을 수행 할 때오류 '데이터 형식을 varchar를 숫자로 변환하는 중 오류가 발생했습니다.'- 새 테이블을 만듭니다.

SELECT '2014/03' AS Period 
    ,ltrim(rtrim(SUBSTRING([Column 0], 1, 12))) AS 'Account' 
    ,cast(ltrim(rtrim(SUBSTRING([Column 0], 17, 2))) + ltrim(rtrim(SUBSTRING([Column 0], 15, 2))) + ltrim(rtrim(SUBSTRING([Column 0], 13, 2))) AS DATE) AS Trans_Date 
    ,CASE 
     WHEN ltrim(rtrim(SUBSTRING([Column 0], 30, 1))) = '-' 
      THEN CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11))) AS DECIMAL)/100) AS DECIMAL(9, 2)) * - 1 
     ELSE CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11))) AS DECIMAL)/100) AS DECIMAL(9, 2)) 
     END AS Amount 
INTO Master_Table2 
FROM Table1_201403 
WHERE SUBSTRING([Column 0], 11, 1) <> 'B' 

, 나는 오류 '오류가 숫자 데이터 유형 VARCHAR 변환'얻을.

적절한 해결책이 될 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.

감사합니다.

수정 -

SELECT '2014/03' AS Period 
    ,ltrim(rtrim(SUBSTRING([Column 0], 1, 12))) AS 'GL Account' 
    ,cast(ltrim(rtrim(SUBSTRING([Column 0], 17, 2))) + ltrim(rtrim(SUBSTRING([Column 0], 15, 2))) + ltrim(rtrim(SUBSTRING([Column 0], 13, 2))) AS DATE) AS Trans_Date 
    ,case 
     when ltrim(rtrim(SUBSTRING([Column 0], 30, 1))) = '-' 
           THEN( 
             case when isnumeric(ltrim(rtrim(SUBSTRING([Column 0], 19, 11))))=1 then    
             CAST(CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2)) AS decimal)*-1 
             else 
             CAST(CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2)) AS varchar)*-1 end 
            ) 
           ELSE(

             case when isnumeric(ltrim(rtrim(SUBSTRING([Column 0], 19, 11))))=1 then    
             CAST(CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2)) AS decimal) 
             else 
             CAST(CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2)) AS varchar) end 
            ) 
      END as Amount 
      INTO TABLE2 
FROM TABLE1 
WHERE SUBSTRING([Column 0], 11, 1) <> 'B' 

내가 ISNUMERIC 논리를 사용했습니다. 그러나 코드가 작동하지 못했습니다. 한번 봐주세요. @Adi T

그리고, 아래 스크립트 @t_m 사용했기 때문에되는 데이터 -

열 0 ValidDecimal 006125 01031400000451745+ JNLCIS 배치 2014년 1월 3일 N BA0119 CL 1 개 006125 01031400000212077+ JNLCIS 배치를 2014 년 1 월 3 일 N BA0120 CL ​​1 006125 01031400000311569+ JNLCIS 일괄 01/03/2014 N BA0119 PL 1

+1

'어떤 적절한 solution.' 오류 메시지가 당신에게 말할합니까 될 수 있는가? 숫자 필드에 varchar를 삽입하는 것을 중지하십시오. CAST 또는 CONVERT를 사용하여 숫자로 변환하십시오. –

+0

숫자로 캐스팅을 시도했지만 도움이되지 않았습니다. u 더 이상 나를 도울 수 있습니까. – 0nir

+0

코드가 IsNumeric 논리로 편집되었지만 도움이되지 않습니다. – 0nir

답변

0

데이터를 varchar에서 decimal.if로 변환하려고합니다. 데이터 charachters에 속하므로 소수로 변환 할 수 없습니다.

use cast() or convert() function 
+0

숫자로 캐스팅을 시도했지만 도움이되지 않았습니다. u 더 이상 나를 도울 수 있습니까. – 0nir

+0

isnumeric (column) = 1 다음 convert() ...이 하나 works.i 번 많은 일을했습니다 – Adi

+0

isnumeric (열) = 1 다음 변환 (십진수) 다른 변환 (varchar) – Adi

1

Amount 논리가 소수 대신 varchar 값을 반환 할 수도 있습니다.

아래 스크립트를 실행하여 금액 논리가 올바른지 확인하십시오. 스크립트를 실행할 때 모두 정상이면 레코드를 반환하지 않아야합니다.

select * 
from 
(
    select '2014/03' as Period, 
    ltrim(rtrim(SUBSTRING([Column 0],1,12))) as 'Account', 
    cast(ltrim(rtrim(SUBSTRING([Column 0],17,2)))+ltrim(rtrim(SUBSTRING([Column 0],15,2)))+ltrim(rtrim(SUBSTRING([Column 0],13,2))) AS DATE) 
    as Trans_Date, 
    ISNUMERIC(case when ltrim(rtrim(SUBSTRING([Column 0],30,1)))='-' then CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2))*-1 
      else CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2)) END) As ValidDecimal 
    from Table1_201403 
    where SUBSTRING([Column 0],11,1) <> 'B' 
) CheckForValidDecimal 
where ValidDecimal = 0 

수정 :이 스크립트 아래

실행하여 [열 0]을 찾을 잘못 기록. 그런 다음 금액 논리를 변경하여 문제를 해결할 수 있습니다.

select * 
from 
(
    select 
    [Column 0], 
    ISNUMERIC(case when ltrim(rtrim(SUBSTRING([Column 0],30,1)))='-' then CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2))*-1 
      else CAST((CAST(ltrim(rtrim(SUBSTRING([Column 0],19,11))) AS decimal)/100) AS decimal(9,2)) END) As ValidDecimal 
    from Table1_201403 
    where SUBSTRING([Column 0],11,1) <> 'B' 
) CheckForValidDecimal 
where ValidDecimal = 0 
+0

모든 경우에 유효 십진수 필드가 0.00 인 레코드를 리턴합니다. 그래서, 주위에 적절한 방법이 될 것입니다. – 0nir

+0

게시 된 수정 된 스크립트는 문제 레코드를 찾습니다. 그런 다음 금액 논리를 수정할 수 있습니다. – Tak

0

시도하십시오 이런 식으로

SELECT '2014/03' AS Period 
     ,ltrim(rtrim(SUBSTRING([Column 0], 1, 12))) AS 'Account' 
     ,cast(ltrim(rtrim(SUBSTRING([Column 0], 17, 2))) + ltrim(rtrim(SUBSTRING([Column 0], 15, 2))) + ltrim(rtrim(SUBSTRING([Column 0], 13, 2))) AS DATE) AS Trans_Date 
     ,CASE 
      WHEN ltrim(rtrim(SUBSTRING([Column 0], 30, 1))) = '-' 
       THEN case when isnumeric(case when isnumeric(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)) 
       ))=1 then    
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS decimal) else 
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS varchar) end)=1 
       then CAST(case when isnumeric(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)) 
       ))=1 then    
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS decimal) else 
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS varchar) end AS decimal(9,2)) *-1 
       else 
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS varchar) 
       ELSE 
        CAST(case when isnumeric(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)) 
       ))=1 then    
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS decimal) else 
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS varchar) end AS decimal(9,2)) /100 AS DECIMAL 
       else 
       CAST(ltrim(rtrim(SUBSTRING([Column 0], 19, 11)))AS varchar) 
       END 
       INTO Master_Table2 
    FROM Table1_201403 
    WHERE SUBSTRING([Column 0], 11, 1) <> 'B' 
+0

도움을 주셔서 감사합니다. 하지만 if-then-else 조건이 있으면 약간의 오류가 발생합니다. – 0nir

+0

은 최종 문장의 becz 수 있습니다 .i didnot properz becz 난 donot 원본 table.100 %이 방법은 작동합니다. 나는 여러 번 했어 – Adi

+0

마침내 당신은 대답을 맞습니까? – Adi

관련 문제