2014-03-26 120 views
0

我有一个搜索我的成员表的选择程序。 成员表具有:SQL:搜索无效日期

ID – Name – Deleted 
1 – Marcus – NULL 
2 – Regina – 2014-03-26 09:33:00.000 

存在:ID的PK INT没有NULL,命名一个varchar(250)和已删除日期时间NULL。

这里是我的方法:

CREATE PROCEDURE dbo.SELECT_MEMBERS 

    @ID int = NULL, 
    @Name varchar(250)= NULL, 
    @Deleted datetime =NULL 

AS 
BEGIN 
IF @Deleted = '' 
     BEGIN 
      SET @Deleted = NULL 
     END  
     ELSE 
     BEGIN 
      SET @Deleted = @Deleted 
     END 

SET NOCOUNT ON; 

    SELECT ID, Name, Deleted 
    FROM dbo.Members WHERE 
     (@ID IS NULL OR @ID = ID) 
    AND (@Name IS NULL OR @Name = Name) 
    AND (@Deleted IS NULL OR @Deleted = Deleted) 


END 
GO 

为了寻找有没有删除的日期成员(如果他们有一个删除日期意味着他们没有活跃成员)我做的:

EXEC dbo.SELECT_MEMBERS @Deleted = '' 

但是这不起作用,因为我得到插入删除日期的行。

我在做什么错?

非常感谢!

+1

使用ISNULL功能 – hgulyan

回答

1
CREATE PROCEDURE dbo.SELECT_MEMBERS 

    @ID int = NULL, 
    @Name varchar(250)= NULL, 
    @Deleted datetime =NULL 

AS 
BEGIN 

SET NOCOUNT ON; 

    SELECT ID, Name, Deleted 
    FROM dbo.Members 
    WHERE ID = ID 
    AND ISNULL(@Name, '') = ISNULL(Name, '') 
    AND ISNULL(@Deleted, '') = ISNULL(Deleted, '') 


END 
GO 
0

看来你想要一个空/ NULL@Deleted日期从NULL值表现不同的@ID@Name:你想为@Deleted实际比较,只有当该值NULL是真实的。

我想你想是这样的:

CREATE PROCEDURE dbo.SELECT_MEMBERS 
    @ID int = NULL, 
    @Name varchar(250)= NULL, 
    @Deleted datetime = NULL 
AS 
BEGIN 
    SELECT ID, Name, Deleted 
    FROM dbo.Members 
    WHERE (@ID IS NULL OR @ID = ID) AND 
     (@Name IS NULL OR @Name = Name) AND 
     ((@Deleted IS NULL OR @Deleted = Deleted or @Deleted = '' and Deleted is null) 
END;