我创建了一个存储过程,当作为参数传递时,应该返回整个表。但如果studentId通过,则返回她的详细信息。 像这样的东西
create procedure usp_GetStudents @studentId int = null
as
if (@studentId = null)
select * from Student
else
select * from Student where studentId = @studentId
输出
exec usp_GetStudents -- No records returned though there are records in the table
exec usp_GetStudents @studentId = null -- No records returned
exec usp_GetStudents @studentId = 256 -- 1 entry returned
只是想知道返回表的所有条目的语法/逻辑是否有任何问题?
谢谢
答案 0 :(得分:4)
您正尝试使用=
comparison operator来测试null。如果您使用ANSI null,则对null
的任何比较都是false
。
如果@studentId
任何值(或null
),则以下表达式均为false
:
@studentId = null -- false
@studentId > null -- false
@studentId >= null -- false
@studentId < null -- false
@studentId <= null -- false
@studentId <> null -- false
因此,为了测试null
,您必须使用特殊谓词is null
,即:
@studentId is null
答案 1 :(得分:2)
更短的方法:
create procedure usp_GetStudents @studentId int = null
as
select * from Student
where studentId = isnull(@studentId,studentId)
使用=
,如果value为null,则无法查询。
对于您的示例,您必须将条件@studentId = null
替换为is null
语法。
尝试更改您的代码,如下所示:
create procedure usp_GetStudents @studentId int = null
as
if (@studentId is null)
select * from Student
else
select * from Student where studentId = @studentId
答案 2 :(得分:0)
将=更改为is
create procedure usp_GetStudents @studentId int = null
as
if (@studentId is null)
select * from Student
else
select * from Student where studentId = @studentId