SQL默默地将int转换为varchar,但是当遇到varchar时会抛出错误?

Dot*_* NF 6 sql sql-server

我最近在一个SQL脚本中遇到了一个问题,其中一个插入语句(插入多行)有一个类型为varchar(10)的列,它插入的数据行是以int方式传递的.

但是,当我添加要插入的新行数据并在varchar列中使用varchar时,SQL尝试将其转换为int,即使该列的类型为varchar(10)

这是您可以在本地运行的示例.

CREATE TABLE dbo.TestTable
    (
    VarcharColumn varchar(10) NOT NULL
    )  ON [PRIMARY]

insert into TestTable(VarcharColumn)
Values (1)
Run Code Online (Sandbox Code Playgroud)

当你运行它时,它会很好地插入,SQL必须以静默方式将该整数值转换为后台的varchar.

但是如果你试试这个:

insert into TestTable(VarcharColumn)
Values (1),(2),('Hello')
Run Code Online (Sandbox Code Playgroud)

SQL将抛出以下错误:

将varchar值'Hello'转换为数据类型int时转换失败.

在这种情况下,任何人都可以解释SQL的内部工作原理吗?特别:

  1. 为什么SQL允许您将整数插入varchar列
  2. 为什么当SQL静默转换这些值时,如果它在实际的varchar上运行,它会尝试将其转换为int.

我理解如何解决这个问题以及如何首先避免它,但我正在寻找一个解释为什么SQL以这种方式工作.

DVT*_*DVT 7

这就是发生的事情.当SQL Server运行时,它会遍历行

 (1),(2),('Hello')
Run Code Online (Sandbox Code Playgroud)

并意识到那里有多种数据类型.因此它将它转换为具有最高优先级的那个(int vs varchar).

这就是你得到错误的原因.

在此处查看有关数据类型优先级的更多信息

https://msdn.microsoft.com/en-us/library/ms190309.aspx