2012-03-03 99 views
-3
我有在表20點LACS的行,並且在該表中的一列

varchar類型,並且我需要改變爲decimal (18,2)類型的列,因爲在數據庫中的列的值是十進制和我需要更改所有欄目,請幫助我。轉換VARCHAR到int

+0

也許你應該調查哪些行不與小數匹配,並將其包含在你的問題中。看起來人們正在用正確的代碼解決你的問題,但你還沒有給出解決你真正問題所需的所有參數。 – 2012-03-03 20:40:51

+0

你顯然在你的列中有數據是**不是**數字 - 使用'SELECT(cols)FROM dbo.YourTable WHERE ISNUMERIC(yourcolumn)= 0'找到它;清理那些數據,然後**然後再試一次... – 2012-03-03 20:48:31

回答

2

爲什麼不

CAST(COLUMN AS DECIMAL(18,2)) 

,或者一個CONVERT

您可能還需要使用ISNUMERIC,以確保它是可轉換

+0

不工作:將數據類型varchar轉換爲數字時出錯。 – 2012-03-03 18:20:27

+1

@ManojWadhwani:那麼在這種情況下,你的'varchar'列中必須有一些數據不是**真的是'int'。過濾出來,刪除或更正這些行 - 然後再試一次 – 2012-03-03 18:22:35

+0

是的,我編輯了我的答案,以顯示如何查找有效投射的值。 ISNUMERIC(COLUMN)= 1告訴你數值,ISNUMERIC(COLUMN)<> 1告訴你無效的值。正如@marc_s所說,你將需要刪除或更正非數字行,否則什麼都不會起作用。 – 2012-03-03 18:37:14

0

嘗試轉換

http://msdn.microsoft.com/en-us/library/ms187928.aspx

這樣的事情

alter table sqlTable add newColumn 

UPdate sqlTable 
Set newColumn = convert(decimal(18,2),oldcolumn) 

alter table sqlTable drop oldcolumn 
+0

同樣的錯誤:將數據類型varchar轉換爲數字時出錯。 – 2012-03-03 18:26:53

0

要遷移數據 - 如果這確實是你的要求 - 你可能最好關閉添加一個新列的表,做一個更新成列,檢查數據,然後下降舊的專欄。如果你想保留原始的列名,你可以重複這個過程。

所以
1. alter table mytable add myNewColumn int(或十進制(18,2),這取決於你的要求)
2.更新mytable的組myNewColumn = cast(myOldColumn as int) or convert(int, myOldColumn) - 見http://msdn.microsoft.com/en-us/library/ms187928.aspx
3.目視檢查數據
4. alter table mytable drop myOldColumn

+0

嘗試但得到相同的錯誤:alter table TestData alter column [NET_ACCOUNTED] [decimal](18,2)NULL – 2012-03-03 18:30:01

+0

我不是建議你改變一列 - 而是你添加一個新的所需數據類型的列,並獲得數據進入它。根據其他反饋 - 您需要檢查使用ISNUMERIC將數據識別爲數字。如果您遇到特定行的問題,哪些數據無法轉換? – kaj 2012-03-03 20:18:26