转换varchar值时转换失败' 3-1'到数据类型int

时间:2018-04-09 23:40:05

标签: sql-server tsql

    USE Zoo

    CREATE TABLE dbo.TypeDetail
    (
        ID int IDENTITY(1,1) NOT NULL,
        AnimalID nvarchar(6) NOT NULL,
        TypeID int NOT NULL
    )

    INSERT INTO dbo.TypeDetail (AnimalID, TypeID)
    VALUES
    (1, 5),
    (1, 8),
    (2, 5),
    (2, 8),
    (3, 5),
    (3, 8),
    ('3-1', 5),
    ('3-1', 8),
    (4, 6),
    (5, 6),
    (6, 6),
    (6, 3),
    ('6-1', 6),
    ('6-1', 15),
    ('6-2', 6),
    ('6-2', 3)

我试图用它来插入值' 3-1'在这个表中,我总是得到一个错误,说它试图将该值转换为int。我需要它作为varchar,所以任何人都有答案吗?

2 个答案:

答案 0 :(得分:2)

INSERT语句的表值构造函数中的第一列值具有混合数据类型。有些是整数,例如6,有些是字符串,例如'6-1'。根据{{​​3}}的规则,它们都转换为int

如果您更改值,以便第一列的值都是字符串,例如'6',不会有问题。

以下代码段演示了该功能:

select Val, SQL_Variant_Property( Val, 'BaseType' ) as BaseType
  from ( values ( '1' ), ( 2 ) ) as PH( Val );

尝试更改值的类型,例如'2'或添加3.14,看看会发生什么。

data type precedence的文档中有一个解释。

答案 1 :(得分:0)

好奇心让我觉得你认为破折号会被翻译成什么int(没有小数值的数字)值。 3-1 = 2? 31?您希望在插入值之前进行数学计算,还是需要减号/破折号?

如果您需要减号,那么您的列必须是字符数据类型,这意味着您已经失去了对其执行数学表达式的能力。

如果你不需要减号(如上面的Mitch所述)并且该列旨在保存整数值,那么应该有某种数据输入过滤器来强制所有输入的值都是整数,而列应该定义为int。否则,您只是为自己未来的错误做好准备。