1

現在の週に基づいて多くのフィルタリングを行う SQL サーバー ストアド プロシージャを作成しています。開始日と終了日を渡すのではなく、単一の日付を渡し、Datepart() を使用して週を除外しています。

    Where DATEPART(WEEK, cd.TurninDate) = DATEPART(WEEK, @StartDate)
      and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate)

top を先を見越して実行しようとすると、マネージャーがこれを毎週だけでなく毎月または四半期ごとに実行するように求めているのを見ることができます。できれば、バージョンごとに Proc を保存したくありません。頻度と日付を渡したいのですが、うまくいきません。

私は試した:

    Where DATEPART(@Freq, cd.TurninDate) = DATEPART(@Freq, @StartDate)
      and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate)

しかし、@Freqが間隔として認識されないというエラーが発生します。

誰も私がそれを回避できる方法を知っていますか?

4

2 に答える 2

10

変数を使用する方法はありませんが、回避できます。

case
 when @part = 'YEAR' THEN DATEPART(YEAR, cd.TurninDate)
 when @part = 'WEEK' THEN DATEPART(WEEK, cd.TurninDate)
 ...
 END

ご覧のとおり、SQL/T-SQL 言語の設計が欠けています。

于 2015-05-27T22:54:48.237 に答える