2011-06-23 26 views
0

我有4個傳遞給查詢的參數。我的要求是返回結果,即使它們中的任何一個都爲空。我們是否必須在where子句中編寫if條件或編寫動態查詢?該參數有一個datetime是其中之一,也是datetime是範圍變量。如何根據運行時傳遞的參數編寫SQL Server 2008查詢

在此先感謝。

+0

你能告訴我們你的基本的SQL查詢是什麼樣子? –

回答

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感謝您的答覆但如果日期時間必須與between.I被定義意味着 創建過程[spDate] (@StartDate日期時間= NULL,@EndDate日期時間= NULL) 作爲 SELECT標題,TargetDate FROM項目 WHERE(TargetDate BETWEEN @StartDate和@EndDate) GO 即使我處理空,但問題是它得到的傳遞日期的parameter.For除權後的所有記錄的結果是:如果我通過12/31/11結果應該是12/31/11的記錄,但結果現在顯示在12/31/11之後,包括上述日期 – user812824

相關問題