sp_executesql的参数中用 case,报错:从数据类型 nvarchar 转换为 numeric 时出错

2024-12-30 21:02:15
推荐回答(2个)
回答1:

--这个是一个乘法,两个值都要是数字
QTY * @MEDIAN

但你在定义为字符型,所以报错了
sp_executesql 还没强大到能解析表达式的地步
如果你要使用表达式就直接拼接SQL就得了

DECLARE @SQL NVARCHAR(1024),@MEDIAN NVARCHAR(12)
SET @MEDIAN=
N'CASE LEFT(STU_CODE, 3) WHEN ''SUB'' THEN 4.70 WHEN ''LID'' THEN 0.73 WHEN ''INK'' THEN 31 END'

SET @SQL='SELECT QTY * ‘+@MEDIAN+’ AS TOTAL_PRICE
FROM COP_STUDENTS ';
exec (@sql)

回答2:

这是因为你定义的@MEDIAN NVARCHAR(12)是字符类型
而sp_executesql的参数化会将一切参数都转换为字符,
也就是QTY *'CASE LEFT(STU_CODE, 3) WHEN ''SUB'' THEN 4.70 WHEN ''LID'' THEN 0.73 WHEN ''INK'' THEN 31 END'
这个字段与整个这个字符相乘,所以这类计算的字符还是要拼接到@sql中
或者把case when写在里面,另定义其他的参数如'sub'或4.70这类的