我的存储过程遇到了一些问题。它要求我以三种不同的方式搜索患者,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
提前感谢您的任何反馈,非常感谢!
编辑:很抱歉花了这么长时间才发布到目前为止我所做的事情。我试过了: 更改程序SearchByMedi @MedicareNum nchar(10), @LastName varchar(50), @PatientID nchar(10) 如 开始 SET NOCOUNT ON;
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
我也尝试过,当@MedicareNum =''时,我使用了你的解决方案(IS NOT NULL)并且它不起作用。我也尝试过: 开始
Select * from Patient
WHERE (@MedicareNum=MedicareNum or @MedicareNum='')
AND (@LastName=LastName or @LastName='')
AND (@PatientID=PatientID or @PatientID='')
End
^此代码返回数据,正确的MedicareNum数据,但LastName和PatientID搜索的数据不正确。
答案 0 :(得分:0)
试试这个:
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
答案 1 :(得分:0)
你错过了复杂条件下的括号:
SELECT * from Patient
WHERE (MedicareNum = @MedicareNum OR @MedicareNum IS NULL)
AND (LastName = @LastName OR @LastName IS NULL)
AND (PatientID = @PatientID OR @PatientID IS NULL)
IMO,更好的是:
SELECT * from Patient
WHERE MedicareNum = ISNULL(@MedicareNum, MedicareNum )
AND LastName = ISNULL(@LastName, LastName )
AND PatientID = ISNULL(@PatientID, PatientID )
答案 2 :(得分:0)
您需要将where子句的不同情况包装在一起。你的OR和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 您原来的方式是一起检查所有三个值而不是每天检查
答案 3 :(得分:0)
尝试这种方法,它更具有性能效率,然后必须添加其他答案中显示的子句。
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