2010-08-18 91 views
6

我支持將平面文件輸入轉換爲SqlServer數據庫表的ETL過程。該代碼幾乎是100%的T-SQL,並在數據庫中運行。我不擁有代碼,不能更改工作流程。我只能幫助配置接收文件數據並將其轉換爲表格數據的「翻譯」SQL(稍後會詳細介紹)。使用逗號分隔符將nVarChar轉換爲十進制數

現在的免責聲明,都閃開......

我們的一個文件提供者最近改變了他們是如何代表的貨幣金額從'12345.67''12,345.67'。我們的SQL轉換值看起來像SELECT FLOOR(CAST([inputValue] AS DECIMAL(24,10)))並且不再有效。也就是說,這個逗號打破了演員陣容。

考慮到我有終值存儲爲Decimal (24,10)數據類型(是的,我意識到FLOOR蓋過後的小數點精度 - 設計者是不是在與客戶同步),我該怎麼辦有效地投射這個字符串?'

謝謝你的想法。

+0

做了這些答案的任何解決您的問題? – 2010-08-19 13:05:32

+0

@KM:我現在正在與我們的DBA小組討論這些建議。從我的結尾,提出的常用方法(使用Replace())似乎可行。將盡快更新。 – SethO 2010-08-19 14:16:50

回答

7

嘗試使用REPLACE (Transact-SQL)

SELECT REPLACE('12,345.67',',','') 

OUTPUT:

12345.67 

所以這將是:

SELECT FLOOR(CAST(REPLACE([input value],',','') AS DECIMAL(24,10))) 
+0

+1 ...替換然後鑄造,以保留原有的功能。 – Fosco 2010-08-18 19:04:57

1

這個工作對我來說:

DECLARE @foo NVARCHAR(100) 
SET @foo='12,345.67' 

SELECT FLOOR(CAST(REPLACE(@foo,',','') AS DECIMAL(24,10))) 

這可能是唯一有效的排序規則/文化中的逗號不是小數點分隔符(即:西班牙)

+0

你提出了一個很好的觀點,David。我知道一些輸入來自歐洲和亞洲 - 這可能會使用逗號將任何字符串操作混淆爲空字符串。我將不得不跟進客戶。 – SethO 2010-08-18 19:09:07

+0

最好讓您的應用程序檢測用戶的語言環境,轉換爲類型化的十進制數,然後將其作爲鍵入的十進制值傳遞到sql服務器。問題消失。 – David 2010-08-18 19:13:47

1

SELECT FLOOR (CAST(REPLACE([inputValue], ',', '') AS DECIMAL(24,10)))

2

雖然不一定適合我的情況,最好的方法,我想離開一個潛在的解決方案以供我們在研究此問題時發現的未來使用。

看起來,SqlServer數據類型MONEY可以用作字符串的直接轉換,用逗號分隔非小數部分。所以,SELECT CAST('12,345.56' AS DECIMAL(24,10))失敗,SELECT CAST('12,345.56' AS MONEY)將成功。

需要注意的是,MONEY數據類型的精度爲4位小數,如果需要的話,需要進行明確的轉換才能將其轉換爲DECIMAL

相關問題