我的项目中有以下case statememt
。
tbl_ExceptionStatus.ExceptionStatusValue IN (case when @excstat='Awaiting ERR Approval' then ('1') else @excstat END)
哪个工作正常,但我必须将其更改为
tbl_ExceptionStatus.ExceptionStatusValue IN (case when @excstat='Awaiting ERR Approval' then ('1','2','3') else @excstat END)
给出了错误 将varchar值'1,2,3'转换为数据类型smallint时转换失败。
如何更改case statememt
以终止错误?
答案 0 :(得分:3)
您有一份表格
的陈述\d+(?:[.,]\d+)*(?:\s*k)?
无效(您无法在案例陈述中返回列表)。
您可以按如下方式重写它:
A IN (CASE WHEN @x='someString' THEN ('1', '2', '3') ELSE @x END)
如果 (@x = 'someString' AND A IN ('1', '2', '3'))
OR (@x <> 'someString' AND A = @x)
永远不能A
,则可以简化为
'someString'
答案 1 :(得分:1)
Case语句遵循数据类型优先级,无论数据类型在then和else子句中是否为高,它都会尝试将它们转换为该数据类型。参见下面的示例
declare @a int
set @a=1
select case when @a=1 then 'a' else 2 end
上面的失败
将varchar值'a'转换为数据类型int
时转换失败
在你的情况下
then ( '1,2,3' )--varchar
else @excstat ----int
您的查询的书面形式不会抛出错误
('1','2','3')
但这确实......
'1,2,3'