2014-03-12 59 views
3

導入工具將每個列作爲varchar(max)放在幾個表中,我正在尋找將列轉換爲正確類型的最快方法。SQL轉換varchar列以浮動

這工作得很好,

ALTER TABLE dbo.myTable ALTER COLUMN myColumn INT 

但失敗草草收場

ALTER TABLE dbo.myTable ALTER COLUMN myColumn FLOAT 

出現錯誤: 消息8114,級別16,狀態5,第26行 錯誤轉換數據類型爲varchar浮動。

如何執行從VarChar(max)類型到Float的泛型列轉換?


我發現這些帖子了一些線索,但我一直沒能得到它的轉換:

Convert varchar to float IF ISNUMERIC

Error converting data type varchar

error converting varchar to float

select case isnumeric([myColumn]) when 1 then cast([myColumn] as float) else null end 
from dbo.myTable 

SELECT TOP (100) CAST(CASE WHEN IsNumeric([myColumn]) = 1 THEN [myColumn] ELSE NULL END AS float) AS [myColumn] 
FROM   dbo.myTable 
WHERE  ([myColumn] NOT LIKE '%[^0-9]%') 

看來ISNUMERIC有一些問題嗎?

我寧願不要做這樣的有很多編輯欄,有沒有像ALTER TABLE一行轉換,在大多數或所有場景的作品?

或者有人建議將數據保存到臨時列中?如果有人可以將代碼發佈到tempColumn中,然後轉換原始代碼並刪除將成爲另一個有效解決方案的tempColumn。

+0

您使用的是哪個版本的SQL Server? – gbn

+0

SQL Server管理員Studii 2008 R2。 也ALTER TABLE語句似乎在大多數列的工作,那裏有隻有兩個表,其中浮法失敗。 – JPK

回答

4

系統的小數分隔符是否與varchar字段中的內容配置方式相同? 在你的情況,我會建議你créate一個新的列(FLOAT),而不是改變現有的列。然後用更新填寫該字段。

這是一種將文本顯式轉換爲浮點的方法。 IN SQL Server此查詢:

select cast(replace('12,5',',','.') as float)*2 

Resutns 25作爲響應。這意味着轉換全成到FLOAT

所以填寫您鑄造新值山坳,你可以這樣做:

UPDATE Table SET FloatField=CAST(REPLACE(TextField,',','.') AS FLOAT) 

也更換爲。 (如果有),然後轉換爲FLOAT。希望這個幫助。

+0

標記爲解決方案,因爲我已將其轉換爲。然後alter table在兩個失敗的表上工作,但爲什麼它對很多領域都有效,無論如何呢? 看起來像ALTER TABLE畢竟是一種通用的方法來處理這個問題,只要你可以修改數據以匹配它所需要的配置。 – JPK

+0

SQL Server只能識別。作爲小數分隔符。顯然你的字符串使用,。這是很多語言中常見的常見問題。替換之後,您可以超越此問題執行強制轉換。在字符串中確保你沒有轉換值的問題。 – ericpap

+0

我今天還有另一張桌子,和。技巧是不是在工作。我只是以不同的方式導入表格,但原始問題仍然是如何將這些東西一般轉換,所以我不需要手動更改數據? – JPK