我有以下存储过程:
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 日。我在这里误解了什么吗?