代码之家  ›  专栏  ›  技术社区  ›  Burak

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

  •  1
  • Burak  · 技术社区  · 2 年前

    我遇到了以下情况

    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') .

    1 回复  |  直到 2 年前
        1
  •  1
  •   Salman Arshad    2 年前

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

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

    在您的示例中,一个值是INT,另一个是VARCHAR,胜利者的数据类型是INT。当将ALL值转换为INT时, '1.0' 失败(它不是INT文字,而是DECIMAL文字),因此出现错误。

    对于上面的示例,您需要执行显式 CAST 在所有非varchar值上,即。 CAST(1 AS VARCHAR(1)) 使得该列的有效数据类型是VARCHAR。