2017-07-12 30 views
2

我有一個使用導入嚮導加載到SQL Server的平面文件。所有列都以nchar(50)存儲。SQL Server - 將字符串轉換爲浮動且存在N/A

我現在試圖將錶轉換爲一個新的表與各種類型(char,float,int等)。

有一列,我想轉換爲浮動,但它包含N/A字符串。

我檢查有沒有使用任何其他怪異的字符串這樣的:

SELECT col1, count(*) 
from tab1 
where ISNUMERIC(col1) <> 1 
group by col1 

然後我寫了一個CASE語句來執行轉換:

SELECT CASE WHEN col1 = 'N/A' THEN NULL ELSE CAST(col1 AS FLOAT) END col1 
INTO tab2 
FROM tab1 

但我發現了這個錯誤消息:

Msg 8114, Level 16, State 5, Line 1 
Error converting data type nvarchar to float. 

任何想法是什麼造成這種情況?

+3

小心使用'ISNUMERIC()'爲此。當你運行'select * from'列'like'%[^ 0-9 \。%'''''''''''' – scsimon

回答

4

如果使用2012+ try_convert()

SELECT col1, count(*) 
from tab1 
where try_convert(float,col1) is null 
group by col1 
4

,如果你想忽略無效的字符以如下

Select try_convert(float, col1) as col1 from yourtable 
2

仔細浮在使用ISNUMERIC()爲此,您可以使用try_convert。它可以返回一些誤報。例如...

select isnumeric('$') 
select isnumeric('1e4') 

這應該告訴你什麼導致錯誤。

select * from table where column like '%[^0-9\.]%' escape '\' 

您可以在where子句中使用,或者使用TRY_CONVERT()

+1

加1用於證明潛在的誤報 –

+0

另一個有趣的是「D」double ---選擇isnumeric('123d4') –

+0

尼斯約翰和感謝隊友。 – scsimon

1

你不這樣做從字符串到浮點類型轉換。在您的SQL語句中,您需要將原始列類型從nvarchar顯式轉換爲float。像這樣的東西可能會工作:

SELECT 
    CASE 
     WHEN col1 = 'N/A' THEN NULL 
     ELSE CAST(col1 AS FLOAT) 
    END col1 
INTO tab2 
FROM tab1