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,所以任何人都有答案吗?
答案 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。否则,您只是为自己未来的错误做好准备。