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'

開始日と終了日の両方を渡すと、レコードが返されなくなります。最初のクエリのレコードの一部が 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 行が返されることを期待していました。

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 に答える