tsql算术溢出仅使用adodb将表达式转换为数据类型int

tsql算术溢出仅使用adodb将表达式转换为数据类型int,sql,sql-server,adodb,Sql,Sql Server,Adodb,对于我正在处理的应用程序,我遇到以下错误: 错误“80040e57” 将表达式转换为数据类型int时出现算术溢出错误 执行此查询时: SELECT 0 as type_elm , 999 AS key0 , def_car.desc_elm as sh_elm , def_car.desc_elm , id_prd = CAST((CASE WHEN def_key0.key0 IS NULL AND def_car.desc_elm <> 'Non Perfezionati

对于我正在处理的应用程序,我遇到以下错误:

错误“80040e57” 将表达式转换为数据类型int时出现算术溢出错误

执行此查询时:

    SELECT 0 as type_elm
, 999 AS key0
, def_car.desc_elm as sh_elm
, def_car.desc_elm
, id_prd = CAST((CASE WHEN def_key0.key0 IS NULL AND def_car.desc_elm <> 'Non Perfezionati'
 THEN CAST((-100 * def_ger.id_prd) as bigint) ELSE (-100 * def_ger.id_cld) + (ISNULL(def_key0.key0,9) * 10) END) AS BIGINT)
, id_cld = CAST((CASE WHEN def_ger.id_cld > 0 THEN CAST((-100 * def_ger.id_cld) as bigint) ELSE 0 END ) AS BIGINT)
 ,CAST(0 AS BIGINT) as id_prd_real
 ,CAST(0 AS BIGINT) as cessato_area
, cessato = CAST((CASE WHEN def_ger.id_cld = 0 THEN def_ger.id_prd ELSE 100 - (def_key0.key0 * 10) END) AS BIGINT)
 ,cessato_orig = CAST((CASE WHEN def_ger.id_cld = 0 THEN def_ger.id_prd ELSE 0 END) AS BIGINT) FROM def_car
 INNER JOIN def_ger ON def_car.id_prd = def_ger.id_prd
 LEFT JOIN def_key0 ON def_key0.desc_key0 = def_car.desc_elm
 WHERE (def_ger.key0 = 999)
 AND def_ger.key_ndg = 539
 AND (def_ger.id_cld = 0 OR def_car.id_prd > 890000000)
 AND def_car.desc_elm <> 'Cestino'
 UNION SELECT def_tree.type_elm
, 999 as key0
, def_tree.sh_elm
, def_tree.desc_elm
, id_prd = CAST((CASE WHEN def_tree.id_prd > 800000000 THEN def_tree.id_prd
 ELSE CAST(CAST(def_car.id_prd as varchar) + RIGHT(('0000' + CAST(def_tree.id_prd as varchar)), 4) as bigint ) END) AS BIGINT)
, id_cld = CAST((CASE WHEN def_tree.id_cld > 800000000 THEN def_tree.id_cld WHEN def_tree.id_cld <= 0 THEN (-100 * def_ger.id_cld) + (def_tree.key0 * 10)
 ELSE CAST(CAST(def_car.id_prd as varchar) + RIGHT(('0000' + CAST(def_tree.id_cld as varchar)), 4) as bigint ) END ) AS BIGINT)
, id_prd_real = CAST((CASE WHEN def_tree.id_prd > 0 THEN def_tree.id_prd ELSE def_car.id_prd END ) AS BIGINT)
 ,CAST(def_car.id_prd AS BIGINT) as cessato_area
, CAST(0 AS BIGINT) as cessato
, CAST(0 AS BIGINT) as cessato_orig FROM def_tree LEFT JOIN def_key0 ON def_tree.key0 = def_key0.key0 LEFT JOIN def_car ON def_key0.desc_key0 = def_car.desc_elm
 LEFT JOIN def_ger ON def_ger.id_prd = def_car.id_prd WHERE def_ger.key_ndg = 539 ORDER BY cessato DESC
, id_cld
, type_elm DESC
, desc_elm 

在具有adoDb对象的asp应用程序中执行,wierd认为此查询在SQL Server中执行时没有问题,在执行到SQL Server后,应用程序运行时没有错误,直到我清除SQL Server的缓存。我不理解这个问题。

从ADO而不是SSMS中得到错误的原因是不同的执行计划。一个计划可能在计划的前面使用问题值计算表达式

考虑从以下位置更改类似的表达式:

CAST((-100 * def_ger.id_cld) as bigint) 

因此,中间结果和最终结果都是较大的类型。

可能重复的
CAST(-100 * CAST(def_ger.id_cld as bigint))