2013-02-21 28 views
1

我執行這樣一個過程:SQL:過程沒有得到一個日期空

EXEC myProcedure @name = 'Smith', @dateDeleted = NULL 

我需要所有沒有被刪除的日期史密斯。

這是程序:

CREATE PROCEDURE [dbo].[myProcedure] 
    @name VARCHAR(8000) = NULL 
,@dateDeleted VARCHAR(8000) = NULL 

AS 
BEGIN 
SET NOCOUNT ON; 
    WITH t 
    (name 
    ,dateDeleted 
    ) 

AS 
(
    SELECT DISTINCT 
    name,dateDeleted FROM mytable 
    WHERE 
    (@name IS NULL OR @name = name) 
    AND (@dateDeleted IS NULL OR CONVERT(DATETIME, @dateDeleted, 102) = dateDeleted) 

) 

執行後我把所有的史密斯,但它不支付任何注意dateDeleted = NULL。我GE所有的史密斯不管他們是否有刪除日期

我該如何解決這個問題?

感謝

+1

@name CHAR (1)=只允許你指定'S'而不是'Smith'.... VARCHAR(8000)的日期?你的數據類型看起來不對。 – 2013-02-21 13:02:41

+0

你沒有檢查表格列: AND(@dateDeleted IS NULL ...應該是 AND(dateDeleted IS NULL ... – jim31415 2013-02-21 13:05:43

+0

[不良習慣踢:選擇錯誤的數據類型](http:// sqlblog .com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data-type.aspx) - 你應該總是使用最合適的數據類型 - 所以不要使用'VARCHAR(8000)'作爲你的'@ dateDeleted' - 使用'DATE'或'DATETIME'(如果你使用SQL Server 2008的話''DATETIME2')!! – 2013-02-21 13:22:26

回答

2

的explantion在您的要求,如果你傳遞NULL,則條件總是true.Try這其中具有COALESCE表達子句:

WHERE (@name IS NULL OR @name = name) 
    AND (COALESCE(@dateDeleted, dateDeleted) IS NULL 
    OR CONVERT(DATETIME, @dateDeleted, 102) = dateDeleted) 
+0

謝謝你! – user712027 2013-02-21 13:27:46

+0

不客氣。 – 2013-02-21 13:53:06