案例陈述中出现此错误的原因是啥

Posted

技术标签:

【中文标题】案例陈述中出现此错误的原因是啥【英文标题】:what is the reason behind this error in case statement案例陈述中出现此错误的原因是什么 【发布时间】:2015-11-24 07:51:09 【问题描述】:

当我执行以下代码时,我得到一个错误

declare @var varchar(10)='a' 
select case @var
when 'a' then 'hi'
when 'b' then 'hello'
else 123
end 

错误消息是 “消息 245,第 16 级,状态 1,第 2 行 将 varchar 值 'hi' 转换为数据类型 int 时转换失败。” 但是当我修改上面的代码时它成功执行了

declare @var varchar(10)='a' 
select case @var
when 'a' then 'hi'
when 'b' then 'hello'
else cast(123 as char(4))
end 

谁能解释为什么我在执行上一个查询时遇到错误? 提前致谢

【问题讨论】:

出于同样的原因,它发生在大多数语言中?您有一个处理不同数据类型值的表达式(不是语句),因此考虑了precedence。 @jarlh - 不,两者都包含CASE 表达式。 SQL Server 没有CASE 语句。 @Damien_The_Unbeliever,对不起,对我来说太早了。刚刚删除了我的评论。现在需要一些咖啡。 @Damien_The_Unbeliever boss case 语句存在于 sql server 中 @asktosmart - 不,SQL Server 只有一个 CASE expression。它没有CASE 声明。 【参考方案1】:

您的CASE...ELSE 是123,它是一个整数。这优先于 varchar 数据类型。您看到错误是因为 SQL Server 正在尝试将您的其他值转换为整数数据类型。将 ELSE 值括在单引号中应该可以解决此问题

declare @var varchar(10)='a' 
select case @var
when 'a' then 'hi'
when 'b' then 'hello'
else '123'
end 

【讨论】:

感谢您的快速响应。 谁对答案投了反对票,你能解释一下吗?【参考方案2】:

因为您将@var 声明为varchar,并且您试图在case 中的else 条件中显示一个int 值。

所以肯定会发生转换错误。

正如 Raj 所回答的,如果您在 '123' 周围加上引号,它会起作用。

【讨论】:

....我在 else 块中写过....如果所有条件都失败了,那么应该返回可用的值....我问我为什么会出错

以上是关于案例陈述中出现此错误的原因是啥的主要内容,如果未能解决你的问题,请参考以下文章

此 HealthKit 错误的原因是啥:“将样本添加到锻炼时发生错误”?

此 HealthKit 错误的原因是啥:“将样本添加到锻炼时发生错误”?

firebase deploy --only 函数上出现 NPM 错误的原因是啥

连接被拒绝错误的原因是啥?

Access 2013:为啥会出现此语法错误?

此 WCF 错误的原因可能是啥?