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中执行该语句,并查看它是否返回任何结果??