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

时间:2016-12-09 00:17:11

标签: sql sql-server

我最近在一个SQL脚本中遇到了一个问题,其中一个insert语句(插入多行)有一个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)

当你运行它时,它会很好地插入,SQL必须在场后静默地将该整数值转换为varchar。

然而如果你试试这个:

insert into TestTable(VarcharColumn)
Values (1),(2),('Hello')

SQL将抛出以下错误:

  

转换varchar值时转换失败&#39> Hello'数据   输入int。

在这种情况下,有人可以解释SQL的内部工作原理吗?具体做法是:

  1. 为什么SQL允许您将整数插入varchar列
  2. 为什么当SQL静默转换这些值时,如果它在实际的varchar上运行,它会尝试将其转换为int。
  3. 我理解如何解决此问题以及如何首先避免它,但我正在寻找一个解释为什么SQL以这种方式工作。

1 个答案:

答案 0 :(得分:7)

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

 (1),(2),('Hello')

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

这就是你收到错误的原因。

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

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