即兴SQL查询

即兴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

我有下面的sql,它需要1或2秒才能返回结果。我在游标内调用这个SQL 500多次。我正在尝试重新编写此查询

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