varchar to numeric:将数据类型varchar转换为numeric时出错

时间:2017-09-21 13:59:39

标签: sql database tsql type-conversion

我正在尝试使用以下代码行将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()函数)从原始列粘贴到其中但是这似乎没有做到这一点,因为上面的代码随着附加的结果而出现“发生了算术溢出。”消息。

2 个答案:

答案 0 :(得分:1)

当某些行的值不正确时,ALTER COLUMN将无效。典型的行动方式如下:

  1. 添加所需类型的新列
  2. 使用您希望保留的值更新列
  3. 删除旧列
  4. 重命名新列
  5. 第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

也许你可以尝试使用你的数据?