tsql算术溢出仅使用adodb将表达式转换为数据类型int
tsql arithmetic overflow converting expression to data type int only with adodb
我正在处理的应用程序出现此错误:
error '80040e57'
Arithmetic overflow error converting expression to data type 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 应用程序中执行,奇怪的是这个查询在 SQL 服务器中执行没有问题,在执行到 SQL 服务器应用程序之后运行没有错误,直到我清除缓存 SQL Server.I 不明白这个问题。
您从 ADO 而不是 SSMS 收到错误的原因是不同的执行计划。一个计划可能会在计划的较早阶段评估具有问题值的表达式。
考虑像这样更改表达式:
CAST((-100 * def_ger.id_cld) as bigint)
至
CAST(-100 * CAST(def_ger.id_cld as bigint))
这样中间结果和最终结果都是较大的类型
我正在处理的应用程序出现此错误:
error '80040e57'
Arithmetic overflow error converting expression to data type 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 应用程序中执行,奇怪的是这个查询在 SQL 服务器中执行没有问题,在执行到 SQL 服务器应用程序之后运行没有错误,直到我清除缓存 SQL Server.I 不明白这个问题。
您从 ADO 而不是 SSMS 收到错误的原因是不同的执行计划。一个计划可能会在计划的较早阶段评估具有问题值的表达式。
考虑像这样更改表达式:
CAST((-100 * def_ger.id_cld) as bigint)
至
CAST(-100 * CAST(def_ger.id_cld as bigint))
这样中间结果和最终结果都是较大的类型