0

我继承了以下声明:

SELECT ISNULL((SELECT (-1)*SUM(CAST(ISNULL(NULLIF(TOTALMTDLCY,''),0) AS DECIMAL(20,5))) 
FROM TI),0) 

虽然我知道它要做什么(防止空值并返回 0),但我觉得必须有一种更高效的方法来做到这一点?

原因是我有一个存储过程,它使用此语句 12 次从不同的表中获取值,用于 40,000 个客户 (480,000),然后为每个 (1.5M) 插入三个记录。

这需要大约 13 分钟才能完成 - 通过收集有关该过程的一些简单统计数据并将它们汇总,它表明虽然 12 条语句的实际时间是 00:00.015,但总时间因此约为 10 分钟。

所以,我的想法是,如果我可以加快这个过程,那么我可以加快我的存储过程吗?

4

3 回答 3

1

您不应该使用 varchar 来存储数值,它只会让您感到悲伤。将所有值从 varchar 转换为 decimal 成本很高。

改变你的桌子喜欢

update TI set TOTALMTDLCY = null where TOTALMTDLCY = ''
alter table TI alter column TOTALMTDLCY DECIMAL(20,5) null

现在您可以毫无问题地选择

select isnull(-sum(TOTALMTDLCY), 0) from TI
于 2012-09-18T11:27:07.607 回答
0

你可以试试这个如果它有效..

SELECT (-1) * SUM(ISNULL(CAST(TOTALMTDLCY AS DECIMAL(20,5)),0)) FROM TI WHERE TOTALMTDLCY <> ''

PS:我目前无法访问 SQL Sever,所以还没有验证它。

于 2012-09-18T11:24:32.440 回答
0
SELECT 
ISNULL(
  -(SELECT SUM(CAST(TOTALMTDLCY as DECIMAL(20,5))) 
     FROM TI where TOTALMTDLCY<>'')
  ,0) 
于 2012-09-18T11:26:05.643 回答