2009-07-07 18 views
1

我有一個CSV文件:從平面文件99.99數字並不想在數字去(4,2)「的SQL Server

1|1.25 
2|23.56 
3|58.99 

我想把這個值在SQL Server表與SSIS。 我已經創建了我的表:

CREATE TABLE myTable(ID int, Value numeric(4,2)); 

我的問題是,我要創建一個派生列轉換到指定我的演員:

(DT_NUMERIC,4,2)(REPLACE(Value,".",",")) 

否則,SSIS似乎不能夠把我的價值在我的專欄中,並用空值填充我的專欄。

我認爲這樣做太糟糕了。我希望我的派生列轉換在這裏用於真正的新派生列,而不是我認爲SSIS必須檢測的一些簡單演員。

那麼,什麼是使用SSIS來解決這個問題的標準方法?

+0

FWIW,我想你已經擁有了最好的解決方法。你的機器的區域設置使用逗號和文件使用週期 - 所以文件的值必須改變,以匹配區域設置 – onupdatecascade 2009-07-23 02:13:53

回答

0

您正在以國際格式加載(56,99代替56.99)。你需要加載這個爲56.99的SQL Server來識別它。取出REPLACE(Value, ".", ","),只是有代碼是:

(DT_NUMERIC,4,2)(Value)

處理的格式上的應用方面,而不是在數據面上。逗號是SQL Server中的保留運算符,您無法更改該事實。

-1

你可以改變你的SSIS源列是在正確的數據類型?

+0

我試圖用正確的數據類型定義我的源列,但是,然後,所有是綠色的,但我的列是無處不在。所以我在字符串(50)中定義,創建一個新的派生列,我的演員,它運行。 – 2009-07-07 08:03:37

+0

你正在做一個替換的事實。與,建議您的機器具有歐洲或類似的設置,因此要求數據爲56,78格式,而不是56.78。如果你可以改變區域設置,那麼它將起作用,否則你將不得不這樣做。這樣做也不是不好的做法,SSIS迫使大量的派生列進行簡單的操作。 – cjk 2009-07-07 08:06:22

-1

如果在生產文件的控制,我建議你到格式的值沒有任何小數或千分:在這種情況下I'ld有值的文件:

1|125 
2|2356 
3|5899 

,然後在導入數據時除以100。雖然它具有獨立於文化的優勢,但它有一些缺點:
1)首先,可能無法強加此文件格式。 2)它假設所有數值都相應地被格式化,在這種情況下,每個值都乘以100;如果您必須混合來自具有不同小數位置的國家/地區的值(許多小數點有兩位小數,但有些小數位數爲零),則這可能會成爲問題。
3)它可能會嚴重影響其他例程,可能不在你的控制範圍內
因此,如果你對csv文件有完全的控制,這真的是一個選擇。

0

還沒有使用SSIS很多,但不能在文件源上設置區域設置或者至少設置小數點分隔符嗎?

1
BULK 
INSERT myTable 
FROM 'c:\csvtest1.txt' 
WITH 
(
FIELDTERMINATOR = '|', 
ROWTERMINATOR = '\n' 
) 

csvtest1.txt

1|1.25 
2|23.56 
3|58.99 
相關問題