2011-06-23 21 views
0

クエリに4つのパラメータが渡されています。私の要件は、いずれかがnullでも結果を返すことです。 where句にif条件を記述するか、動的クエリを記述する必要がありますか?パラメータにはdatetimeが含まれており、datetimeも範囲変数です。実行時に渡されるパラメータに基づいてSQL Server 2008クエリを作成する方法

ありがとうございます。

+0

基本的なSQLクエリの外観を教えてください。日時はbetween.Iで定義しなければならない場合 作成意味 –

答えて

1

私が正しく理解している場合は、NULLパラメータ値も処理するwhere句を準備する必要があります。

だから、これは解決策が考えられます。

declare @myDate datetime = NULL; 
declare @myRangeFrom datetime = NULL; 
declare @myRangeUntil datetime = NULL; 

SELECT * FROM MyTable 
WHERE (@myDate IS NULL OR tblDate = @myDate) 
AND (@myRangeFrom IS NULL OR tbl2ndDate >= @myRangeFrom) 
AND (@myRangeUntil IS NULL OR tbl2ndDate <= @myRangeUntil) 
0

私が何を求めていることは、「SQLオプションパラメータ」だと思う:

CREATE PROCEDURE TestProc 
(
    @Param1 varchar(50) = NULL, 
    @Param2 varchar(50) = NULL, 
    @Param3 varchar(50) = NULL 
) 
AS 
SELECT 
    * 
FROM 
    TestTable 

WHERE 
    ((@Param1 IS NULL) OR (col1 = @Param1)) AND 
    ((@Param2 IS NULL) OR (col2 = @Param2)) AND 
    ((@Param3 IS NULL) OR (col3 = @Param3)) 

しかし、このクエリのパフォーマンスの問題があります;見た目に優雅なので、SQL Serverがインデックスを正しく使用できなくなります。パフォーマンスが問題の場合は、sp_executesqlを使用して文字列を動的に作成し、クエリとして実行する方がよいでしょう。

参照:http://www.davewentzel.com/content/optional-sql-parameters-and-performance

+0

HI応答していただきありがとうございますが、手順[spDate] (@StartDate日時=ヌル、@EndDate日時= NULL) SELECTタイトル、TargetDate FROMとしてプロジェクト (@StartDateと@EndDate BETWEEN TargetDate) GO 私はNULLハンドルが、問題はそれがparameter.For例に渡された日付の後にすべてのレコードの結果を得るだろうにもかかわらず:私は12を渡した場合/ 31/11結果は12月31日に記録されますが、結果には上記の日付を含む12/31/11の後にすべてが表示されます – user812824

関連する問題