SQL 默默地将 int 转换为 varchar,但在遇到 varchar 时会抛出错误?
Posted
技术标签:
【中文标题】SQL 默默地将 int 转换为 varchar,但在遇到 varchar 时会抛出错误?【英文标题】:SQL silently converts int to varchar, but then throws an error when it comes across a varchar? 【发布时间】:2016-12-09 00:17:10 【问题描述】:我最近在 SQL 脚本中遇到了一个问题,其中插入语句(插入多行)有一个 varchar(10) 类型的列,并且它插入的数据行是以整数形式传递的。
但是,当我添加要插入的新数据行并在 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 值“Hello”转换为数据时转换失败 输入整数。
在这种情况下,任何人都可以解释一下 SQL 的内部工作原理吗?具体来说:
-
为什么 SQL 允许您将整数插入到 varchar 列中
为什么当 SQL 静默转换这些值时,如果它遇到实际的 varchar,它会尝试将其转换为 int。
我首先了解如何解决此问题以及如何避免此问题,但我正在寻找有关 SQL 为何以这种方式工作的解释。
【问题讨论】:
通过documentation 要解释什么?您的问题表明您完全了解情况。答案是:SQL Server 就是这样工作的。 @GordonLinoff 这不是我问的。我问了两个问题,一个是关于为什么它允许隐式转换(vkp 的文档链接似乎解释了这一点)以及隐式转换如何在具有多行的插入语句中工作。 “这就是它的工作原理”是一个糟糕的、毫无意义的陈述。 【参考方案1】:这就是发生的事情。当 SQL Server 运行时,它会遍历行
(1),(2),('Hello')
并意识到那里有不止一种数据类型。因此它将它转换为具有最高优先级的那个(int vs varchar)。
这就是你得到错误的原因。
在此处查看有关数据类型优先级的更多信息
https://msdn.microsoft.com/en-us/library/ms190309.aspx
【讨论】:
@GordonLinoff 我认为你是对的。我编辑了答案。 。 .我认为它决定了编译期间的类型。它可能会在编译时产生错误;它可能会在运行时产生错误。如果你知道它是一个编译错误,那么描述就可以了。 @GordonLinoff 我尝试使用 INSERT ... VALUES (1),(2) 运行测试。我得到了Constant Scan -> Compute Scalar -> Table Insert -> INSERT的查询计划(从右到左)。所以我猜想先执行常量扫描,将所有内容都转换为 int,然后 Table Insert 将 int 转换为 varchar。 写得好,我实际上只是尝试运行类似的语句 insert into TestTable(VarcharColumn) Values ('hello'),(2),('15') 并且它(如你所说)发现int 作为最高优先级并尝试将所有值转换为它。 '15' 在这种情况下是有效的,但 'hello' 不是。感谢您解释这一点! @DotNetNF 感谢您的提问。我能够更清楚地阐明我的想法,试图把它写下来(因此更好地理解它)。以上是关于SQL 默默地将 int 转换为 varchar,但在遇到 varchar 时会抛出错误?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 认为我在使用连字符时尝试将 varchar 转换为 int
MS-SQL中,在CASE判断时可不可以将int类型转换为Varchar类型
SQL表单提示"从数据类型varchar转换为int时出错"