【问题标题】:Conversion failed when converting the varchar value '3-1' to data type int将 varchar 值“3-1”转换为数据类型 int 时转换失败
【发布时间】:2018-04-09 23:40:04
【问题描述】:
    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,所以有人有答案吗?

【问题讨论】:

  • 当然,真正的问题是“为什么 AnimalID 是 nvarchar(6)?”不应该……

标签: sql-server tsql


【解决方案1】:

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

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

以下代码 sn -p 演示了该功能:

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

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

table value constructor data types 的文档中有解释。

【讨论】:

  • 换句话说,您需要将nvarchar 列中的值括在引号中。你应该写'1' 而不是1
  • @VladimirBaranov 是的,所有值都必须是引号中的字符串。 (如果您在示例代码中输入另一个值和数据类型,例如3.14,所有值都会更改为numeric。)(或castconvert 到字符串数据类型,但只需添加引号更容易。)
【解决方案2】:

对于您认为破折号会被转换为什么 int(没有十进制值的数字)值,我感到非常好奇。 3-1=2? 31?您希望在插入值之前进行数学运算,还是需要减号/破折号?

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

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

【讨论】:

  • 该列声明为AnimalID nvarchar(6) NOT NULL,值为'3-1',所以问题是:哪里转换成INT
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多