2012-03-03 101 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