我最近在一个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的内部工作原理吗?具体做法是:
我理解如何解决此问题以及如何首先避免它,但我正在寻找一个解释为什么SQL以这种方式工作。
答案 0 :(得分:7)
这就是发生的事。当SQL Server运行时,它会遍历行
(1),(2),('Hello')
并意识到那里有多种数据类型。因此它将它转换为具有最高优先级的那个(int vs varchar)。
这就是你收到错误的原因。
在此处查看有关数据类型优先级的更多信息