我正在尝试使用以下代码行将varchar格式的列转换为十进制(19,12)
ALTER TABLE [tablename]
ALTER COLUMN [columnname][format]
并获得以下提示:
Msg 8114, Level 16, State 5, Line 25
Error converting data type varchar to numeric.
之前曾经像魅力一样工作过。这里的问题似乎是列中的值是19个左右的数字数字值,格式为文本。
我尝试创建一个新列,将缩短的单元格值(使用left()函数)从原始列粘贴到其中但是这似乎没有做到这一点,因为上面的代码随着附加的结果而出现“发生了算术溢出。”消息。
答案 0 :(得分:1)
当某些行的值不正确时,ALTER COLUMN
将无效。典型的行动方式如下:
第2步会是这样的:
UPDATE MyTable
SET NewColumn =
CASE WHEN ISNUMERIC(OldColumn)=1 AND DATALENGTH(OldColumn) <= 19 THEN
CAST(OldColumn AS decimal(19,12))
ELSE
NULL
END
您还可以使用SET ANSI_WARNINGS OFF
命令关闭ANSI警告,这样您就可以运行ALTER COLUMN
忽略数据错误。这种方法的缺点是潜在的错误被忽略了。另一方面,当您使用CASE
表达式明确转换时,您可以选择为错误情况提供替代值(我上面使用了NULL
,但您可以输入任何您想要的数字)
答案 1 :(得分:1)
你能尝试分开你的问题吗?这适用于SQL 2012:
set nocount on
if object_id ('tempdb..#t1') is not null drop table #t1
create table #t1 (c1 varchar(100))
insert #t1 values ('1234567.8901234567890')
select * from #t1
alter table #t1
alter column c1 decimal(19,12)
select * from #t1
如果你用字符串玩一下,你很容易产生一个惊人的溢出错误。但是“将数据类型varchar转换为数字时出错”需要字符或空sting 。
也许你可以尝试使用你的数据?