0

我有以下存储过程:

ALTER PROCEDURE [dbo].[GetErrorsByDate]
(
    @p_skip INT
   ,@p_take INT
   ,@p_orderBy VARCHAR(50) = 'TimestampDesc'
   ,@p_startDate SMALLDATETIME = NULL
   ,@p_endDate SMALLDATETIME = NULL
)
AS
BEGIN

    WITH pathAuditErrorLogCT AS
    (
        SELECT
          CASE
            WHEN @p_orderBy = 'TimestampAsc' THEN ROW_NUMBER() OVER (ORDER BY E.[Timestamp])
            WHEN @p_orderBy = 'TimestampDesc' THEN ROW_NUMBER() OVER (ORDER BY E.[Timestamp] DESC)                                         
            WHEN @p_orderBy = 'LogIdAsc' THEN ROW_NUMBER() OVER (ORDER BY E.LogId)
            WHEN @p_orderBy = 'LogIdDesc' THEN ROW_NUMBER() OVER (ORDER BY E.LogId DESC)                                 
            WHEN @p_orderBy = 'ReferrerUrlAsc' THEN ROW_NUMBER() OVER (ORDER BY E.ReferrerUrl)
            WHEN @p_orderBy = 'ReferrerUrlDesc' THEN ROW_NUMBER() OVER (ORDER BY E.ReferrerUrl DESC)                                    
          END AS RowNum
          ,E.Id
        FROM pathAuditErrorLog AS E   
        WHERE
          (E.[Timestamp] >= @p_startDate OR @p_startDate IS NULL)
        AND
          (E.[Timestamp] <= @p_endDate OR @p_endDate IS NULL)                     
    )                   
    SELECT
      E.Id
     ,E.Node
     ,E.HttpCode
     ,E.[Timestamp]
     ,E.[Version]
     ,E.LogID
     ,E.IsFrontEnd
     ,E.ReferrerUrl
     ,E.[Login]
     ,E.BrowserName
     ,E.BrowserVersion
     ,E.ErrorDetails
     ,E.ServerVariables
     ,E.StackTrace
    FROM pathAuditErrorLog AS E

    INNER JOIN pathAuditErrorLogCT AS pct ON pct.Id = E.Id

    WHERE pct.RowNum BETWEEN @p_skip + 1 AND (@p_skip + @p_take)

    ORDER BY RowNum
END

这个想法是该过程从错误表中返回数据,但允许动态列排序、分页和日期过滤。我的问题是作为公用表表达式一部分的日期过滤。我无法让这个工作。

如果我删除日期过滤逻辑,那么 proc 工作正常。包含它,即使有预期的行,我也经常没有返回任何行。例如,如果我尝试:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-02-05'

只给出开始日期,然后我得到一堆记录。但是,如果我这样做:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-02-05', '2013-02-05'

通过开始和结束日期,我最终没有返回任何记录。这很奇怪,因为我预计第一个查询中的一些记录会出现在第二个查询中。

有人可以发现我做错了什么吗?

编辑:我已经应用了 AdaTheDev 的建议,它看起来更接近我的需要。但是,我发现了一种情况,建议的方法没有返回我的预期。如果我运行以下命令:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-01-01', '2013-01-03'

我得到一个时间戳为的行2013-01-02 13:29:00。如果我运行这个:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-01-01', '2013-01-02'

我没有返回任何行。我希望看到上一个查询中的一行被返回,因为它的时间戳确实落在 2013 年 1 月 2 日。我在这里误解了什么吗?

4

1 回答 1

2

这只会返回Timestamp正好是 2013-02-05(即午夜)的记录,因此当天的记录将不包括在内(我假设它们都有关联的时间)。

如果您想包括它们,我会将条款更改为:

WHERE
          (e.[Timestamp] >= @p_startDate OR @p_startDate IS NULL)
        AND
          (e.[Timestamp] < @p_endDate OR @p_endDate IS NULL) 

(更改是 @p_enddate 子句现在只是<

然后做:

exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-02-05', '2013-02-06'
于 2013-02-06T11:14:25.123 回答