2017-08-06 65 views
1

我們正在開發映射項目,在這個項目中首先我們需要導入一個.csv文件,之後這個數據會被導入到表中,我們有一些外部在臨時表預定義列,與此列,我們需要匹配的數據與CSV導入的數據,我們做了這樣的功能,但同時節省映射數據對某些情況下,我們得到一個SQL錯誤:SQL Server獲取算術溢出錯誤將vachar轉換爲數據類型數字

Numeric value out of range,arithmatic overflow error, converting varchar to data type numeric

我們執行該查詢:

INSERT INTO SD_Trey_Sams ([PharmacyTotalClaimAmt], [PharmacyMiscFee]) 
    SELECT 
     CONVERT(DECIMAL(12, 2), LEFT(SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid), '\', '')), 8000), PATINDEX('%[^0-9.-]%', SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid),'\','')), 8000) + 'X') -1)) AS [TRIM(PatientPaid)] 
    FROM 
     file_598071306a1b4 

任何人都可以幫我解決這個問題嗎?我想插入file_598071306a1b4表中存在的所有數據,這個表格將包含CSV數據,這個數據可以是任何

+2

那麼,您的'.csv'文件中的數據是什麼樣的? –

+0

我相信你的DECIMAL(12,2)是理由嘗試一個更大的小數點 –

+0

@marc_s,CSV有大約2.5萬記錄,所以很難說數據,它的價格就像53434.50美元那樣,它可以也是字符串,所以我刪除了非數字數據 –

回答

0

這是一個評論太長。

找到有問題的價格。我首先想到的是:

SELECT 
    CONVERT(DECIMAL(38, 10), LEFT(SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid), '\', '')), 8000), PATINDEX('%[^0-9.-]%', SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid),'\','')), 8000) + 'X') -1)) AS val 
FROM file_598071306a1b4 
ORDER BY val DESC; 

當然,這仍然可能溢出,所以你可以只專注於長度:

SELECT * 
FROM (SELECT CONVERT(DECIMAL(38, 10), LEFT(SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid), '\', '')), 8000), PATINDEX('%[^0-9.-]%', SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid),'\','')), 8000) + 'X') -1)) AS val 
     FROM file_598071306a1b4 
    ) t 
ORDER BY LEN(val) DESC; 

而且,如果你是內容越來越NULL值時,轉換呢不起作用,則改爲使用TRY_CONVERT()。因此,這可能是最簡單的調查方式:

SELECT * 
FROM (SELECT PatientPaid, 
      TRY_CONVERT(DECIMAL(38, 10), LEFT(SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid), '\', '')), 8000), PATINDEX('%[^0-9.-]%', SUBSTRING(REPLACE(TRIM(PatientPaid), '\', ''), PATINDEX('%[0-9.-]%', REPLACE(TRIM(PatientPaid),'\','')), 8000) + 'X') -1)) AS val 
     FROM file_598071306a1b4 
    ) t 
WHERE val IS NULL; 
+0

謝謝@Gordon,我解決了由TRY_CONVERT函數發出 –

0

@NikulPanchal不知道你的輸入是什麼,我們可以稍微說一點,但知道這裏有很多你需要考慮

  1. 你輸入的字符串,增加類似大小的東西(18,6),或儘可能您的輸入字符串需要

  2. 此外,由於要插入到另一個表讓我告訴你,如果你的列大小小於輸入,那麼它會自動修剪...

PS:希望把作爲評論而不是答案,但它太長

+0

'numeric'是'decimal'的同義詞 - 這不會改變任何東西... –

+0

@marc_s inreasing變量大小確實 –

相關問題