我有以下存储过程:
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日落下。我在这里误解了什么吗?
答案 0 :(得分: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'