2014-08-29 73 views
0

我有一個表「Table1_201403」,帶有1個varchar列'列0'。現在,我想從這個表下面的查詢插入必要的數據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_m是如下得到 -

列0 ValidDecimal 006125 01031400000451745+ JNLCIS批次2014年1月3日ÑBA0119 CL 1個 006125 01031400000212077+ JNLCIS批次01/03/2014 N BA0120 CL​​ 1 006125 01031400000311569+ JNLCIS Batch 01/03/2014 N BA0119 PL 1

+1

'什麼可以適當solution.'沒有錯誤消息告訴你嗎?停止嘗試將一個varchar插入到數字字段中。使用CAST或CONVERT將其轉換爲數字。 – 2014-08-29 17:49:10

+0

我試圖將數字轉換爲數字,但沒有幫助。你能不能進一步幫助我? – 0nir 2014-08-29 18:00:14

+0

使用IsNumeric邏輯編輯代碼但不起作用。 – 0nir 2014-08-29 19:05:11

回答

0

您試圖將數據從varchar轉換爲decimal.if數據屬於你無法轉換爲十進制的字符。

use cast() or convert() function 
+0

我試着作爲數字鑄造,但沒有幫助。你能不能進一步幫助我? – 0nir 2014-08-29 17:58:14

+0

isnumeric(column)= 1 then convert()... this one works.i have done many times – Adi 2014-08-29 17:59:43

+0

isnumeric(column)= 1 then convert(to decimal)else convert(to varchar) – Adi 2014-08-29 18:07:44

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 2014-08-29 18:08:30

+0

發佈已修改的腳本以查找問題記錄。然後您可以修復金額邏輯。 – Tak 2014-08-29 18:16:27

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 2014-08-29 18:34:53

+0

可能bebez結束聲明。我沒有保持適當,因爲我沒有源表.100%這種方式將工作。我已經做了很多次 – Adi 2014-08-29 18:36:24

+0

終於你得到了答案的權利? – Adi 2014-08-29 18:38:05

相關問題