次のストアド プロシージャがあります。
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'
開始日と終了日の両方を渡すと、レコードが返されなくなります。最初のクエリのレコードの一部が 2 番目のクエリに表示されると思っていたので、これは奇妙です。
誰かが私が間違っていることを見つけてもらえますか?
編集: AdaTheDev が提案したものを適用しましたが、必要なものに近づいています。ただし、提案されたメソッドが期待どおりに返されないケースが 1 つ見つかりました。次を実行すると:
exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-01-01', '2013-01-03'
タイムスタンプが の行を 1 つ取得します2013-01-02 13:29:00
。これを実行すると:
exec GetErrorsByDate 0, 10, 'TimestampDesc', '2013-01-01', '2013-01-02'
行が返されません。タイムスタンプが 2013 年 1 月 2 日であるため、前のクエリから 1 行が返されることを期待していました。