我最近在一个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的内部工作原理吗?特别:
我理解如何解决这个问题以及如何首先避免它,但我正在寻找一个解释为什么SQL以这种方式工作.
这就是发生的事情.当SQL Server运行时,它会遍历行
(1),(2),('Hello')
Run Code Online (Sandbox Code Playgroud)
并意识到那里有多种数据类型.因此它将它转换为具有最高优先级的那个(int vs varchar).
这就是你得到错误的原因.
在此处查看有关数据类型优先级的更多信息
https://msdn.microsoft.com/en-us/library/ms190309.aspx