插入多个项目时将varchar转换为int数据类型时转换失败

问题描述 投票:0回答:1

我遇到过以下场景:

CREATE TABLE Test (Foo NVARCHAR(MAX))
INSERT INTO Test (Foo) VALUES ('1.0')
INSERT INTO Test (Foo) VALUES (1)

两个插件都工作正常。但是当我们像这样将它们插入在一起时:

INSERT INTO Test (Foo) VALUES
('1.0'),
(1)

我收到此错误

将 varchar 值“1.0”转换为数据类型 int 时转换失败

我不明白为什么它试图将值转换为

int
并且我找不到有关此行为的任何文档。插入的顺序是什么或者是否写成
(N'1.0')
并不重要。

sql-server t-sql type-conversion sqldatatypes
1个回答
1
投票

VALUES
是一个表值构造函数,由行和列组成,因此数据类型优先规则适用于确定列的数据类型:

多行INSERT语句中指定的值跟随数据 UNION ALL 语法的类型转换属性。这导致 不匹配类型到更高类型的隐式转换 优先。

在您的示例中,一个值是 INT,另一个值是 VARCHAR,获胜者的数据类型是 INT。将所有值转换为 INT 时,

'1.0'
失败(它不是 INT 文字,而是 DECIMAL 文字),因此出现错误。

对于上面的示例,您需要对所有非 varchar 值执行显式

CAST
,即
CAST(1 AS VARCHAR(1))
,以便列的有效数据类型为 VARCHAR。

© www.soinside.com 2019 - 2024. All rights reserved.