即兴SQL查询
我有下面的sql,它需要1或2秒才能返回结果。我在游标内调用这个SQL 500多次。我正在尝试重新编写此查询即兴SQL查询,sql,sql-server,sql-server-2008,sql-server-2012,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2012,Sql Server 2008 R2,我有下面的sql,它需要1或2秒才能返回结果。我在游标内调用这个SQL 500多次。我正在尝试重新编写此查询 SELECT Sum(CASE WHEN UpdatedAdjustedOT IS NOT NULL AND UpdatedAdjustedOT != '' AND UpdatedAdjustedOT != '0' THEN CONVE
SELECT Sum(CASE
WHEN UpdatedAdjustedOT IS NOT NULL
AND UpdatedAdjustedOT != ''
AND UpdatedAdjustedOT != '0'
THEN CONVERT(DECIMAL(18, 2), UpdatedAdjustedOT)
ELSE 0
END) AS OTHours
FROM tbl_OTAuthorization
WHERE EmployeeCodeFK = @EmployeeCode
AND month(OTDate) = Month(@FromDate)
AND year(OTDate) = Year(@FromDate)
请建议我如何以更好的方式重新编写此查询
不要对函数结果进行过滤。找到一种替代方法:
AND month(OTDate) = Month(@FromDate)
AND year(OTDate) = Year(@FromDate)
对这样的事情:
and OTDate >= the first day of the month for @FromDate
and OTDate < the first day of the month following @FromDate
SELECT . . .
FROM tbl_OTAuthorization
WHERE EmployeeCodeFK = @EmployeeCode AND
OTDate >= DATEADD(day, 1 - DAY(@FromDate), @FromDate) AND
OTDate < DATEADD(month, 1, DATEADD(@FromDate, 1 - DAY(@FromDate), @FromDate));
和OTDate>=@FromDate的月份第一天
和OTDate<下一个月的第一天@FromDate
首先,重新编写WHERE
子句,如下所示:
and OTDate >= the first day of the month for @FromDate
and OTDate < the first day of the month following @FromDate
SELECT . . .
FROM tbl_OTAuthorization
WHERE EmployeeCodeFK = @EmployeeCode AND
OTDate >= DATEADD(day, 1 - DAY(@FromDate), @FromDate) AND
OTDate < DATEADD(month, 1, DATEADD(@FromDate, 1 - DAY(@FromDate), @FromDate));
第三,返回并修复代码,使其不会在员工和日期之间循环。您应该能够在单个查询中处理逻辑。通常,如果要优化使用数据库的性能,请避免使用游标。尝试以下方法:
SELECT Sum(CONVERT(DECIMAL(18, 2), ISNULL(NULLIF(UpdatedAdjustedOT, ''), 0))) as OTHours
FROM tbl_OTAuthorization
WHERE EmployeeCodeFK = @EmployeeCode
AND month(OTDate) = Month(@FromDate)
AND year(OTDate) = Year(@FromDate)
其中EmployeeCodeFK=@EmployeeCode
和OTDate>=DATEADD(月,DATEDIFF(月,0,@FromDate),0)
和OTDate
调用此查询的外部查询是什么?这看起来本身并不昂贵,但如果你在游标中使用它,那么我们需要查看外部查询以了解它在做什么。我在游标中有employeelist。我必须通过在这个SQL中传递employeecode来找到其他人问题在你的游标中,所以发布所有代码,我们可以帮助它看起来CASE语句是不必要的。只需SUM(updatedAdjustDot)
并将这些条件添加到WHERE子句中<代码>其中UpdatedAdjustDot不为NULL且UpdatedAdjustDot!=''和UpdatedAdjustDot!='0'所以您问了一个关于代码中非常特定部分的问题(这意味着您不知道如何修复它)。不止一个评论者建议发布外部代码,希望我们能找到更好的解决方案,但你知道的更好吗?顺便说一句,基于集合的方法只会命中这些表一次,而不是像光标那样命中500多次)谢谢Gordon Linoff