Sql server 存储过程WHERE子句

Sql server 存储过程WHERE子句,sql-server,stored-procedures,Sql Server,Stored Procedures,我的存储过程有一些问题。它要求我以三种不同的方式搜索患者,PatientID、LastName和MedicareNum。出于某种原因,我可以通过MedicareNum进行搜索,但无法使用其他两个进行搜索 以下是我目前的代码: ALTER PROCEDURE SearchByMedi ( @MedicareNum nchar (10), @LastName varchar(50), @PatientID nchar(10) ) as Begin SELECT * f

我的存储过程有一些问题。它要求我以三种不同的方式搜索患者,
PatientID
LastName
MedicareNum
。出于某种原因,我可以通过
MedicareNum
进行搜索,但无法使用其他两个进行搜索

以下是我目前的代码:

ALTER PROCEDURE SearchByMedi
(
    @MedicareNum nchar (10),
    @LastName varchar(50),
    @PatientID nchar(10)
)
as
Begin
    SELECT * from Patient
    WHERE MedicareNum = @MedicareNum OR @MedicareNum IS NULL
      AND LastName = @LastName OR @LastName IS NULL
      AND PatientID = @PatientID OR @PatientID IS NULL
End
提前感谢您的反馈,非常感谢

编辑:很抱歉花了这么长时间来发布我到目前为止所做的事情。我试过: ALTER PROCEDURE SearchByMedi @紫花苜蓿(10), @姓氏varchar(50), @PatientID nchar(10) 像 开始 不计数

DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'SELECT * from Patient WHERE 1 = 1 '
         + CASE WHEN @MedicareNum=''
                THEN N' AND MedicareNum = @MedicareNum'
                ELSE N' ' END
         + CASE WHEN @LastName=''
                THEN N' AND  LastName = @LastName'
                ELSE N' ' END
         + CASE WHEN @PatientID=''
                THEN N' AND PatientID = @PatientID '
                ELSE N'' END

EXECUTE sp_executesql @Sql
                 ,N'@MedicareNum nchar(10), @LastName varchar(50),@PatientID nchar(10)'
                 ,@MedicareNum
                 ,@LastName 
                 ,@PatientID

END
我也试过当@Medicareum=''时,我使用了你的解决方案(不是空的),但它不起作用。我也尝试过: 开始

Select * from Patient
WHERE (@MedicareNum=MedicareNum or @MedicareNum='')
AND (@LastName=LastName or @LastName='')
AND (@PatientID=PatientID or @PatientID='')

End
^此代码返回数据,即Medicareum的正确数据,但按LastName和PatientID搜索的数据不正确

试试这个:

ALTER PROCEDURE SearchByMedi
(
@MedicareNum nchar (10),
@LastName varchar(50),
@PatientID nchar(10)
)
as
Begin

SELECT * from Patient
WHERE MedicareNum = @MedicareNum OR @MedicareNum IS NULL
AND (LastName = @LastName OR @LastName IS NULL)
AND (PatientID = @PatientID OR @PatientID IS NULL )

End

在复杂的条件下,您遗漏了括号:

SELECT * from Patient
WHERE (MedicareNum = @MedicareNum OR @MedicareNum IS NULL)
AND (LastName = @LastName OR @LastName IS NULL)
AND (PatientID = @PatientID OR @PatientID IS NULL)
海事组织,更好的做法是:

SELECT * from Patient
WHERE MedicareNum = ISNULL(@MedicareNum, MedicareNum )
AND LastName = ISNULL(@LastName, LastName )
AND PatientID = ISNULL(@PatientID, PatientID )

您需要将where子句的不同情况打包在一起。您的ORs和and正在一起运行

ALTER PROCEDURE SearchByMedi
(
@MedicareNum nchar (10),
@LastName varchar(50),
@PatientID nchar(10)
)
as
Begin

SELECT * from Patient
WHERE (MedicareNum = @MedicareNum OR @MedicareNum IS NULL)
AND (LastName = @LastName OR @LastName IS NULL)
AND (PatientID = @PatientID OR @PatientID IS NULL)

End
通过这种方式,您将得到MedicareNum=var或null,然后LastName=var或null
您最初的方法是将所有三个值一起检查,而不是以虚拟方式检查。尝试这种方法,它比添加其他答案中所示的子句更高效

CREATE PROCEDURE SearchByMedi
@MedicareNum nchar (10),
@LastName    varchar(50),
@PatientID   nchar(10)
AS
BEGIN
 SET NOCOUNT ON;

  DECLARE @Sql NVARCHAR(MAX);

  SET @Sql = N'SELECT * from Patient WHERE 1 = 1 '
             + CASE WHEN @MedicareNum IS NOT NULL
                    THEN N' AND MedicareNum = @MedicareNum'
                    ELSE N' ' END
             + CASE WHEN @LastName IS NOT NULL
                    THEN N' AND  LastName = @LastName'
                    ELSE N' ' END
             + CASE WHEN @PatientID IS NOT NULL
                    THEN N' AND PatientID = @PatientID '
                    ELSE N'' END

EXECUTE sp_executesql @Sql
                     ,N'@MedicareNum nchar(10), @LastName varchar(50),@PatientID nchar(10)'
                     ,@MedicareNum
                     ,@LastName 
                     ,@PatientID

END

我使用了这段代码,它不会带回任何数据。我知道这是我的存储过程代码,因为在使用它之前,我至少可以通过MedicareNum进行搜索。不过谢谢你。这确实管用!非常感谢。我的不起作用,因为我使用的是数据进入的文本框,而不是用户输入数据的文本框。再次感谢你!我超级兴奋!确实如此,伙计,在你的问题中张贴你的尝试,让我们看看你做了什么?您是否也尝试过在SSMS中执行该语句,并查看它是否返回任何结果??