2

我创建了一个存储过程,当不传递任何参数时,它应该返回整个表。但是如果通过了 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

只是想知道返回表的所有条目的语法/逻辑是否有问题?

谢谢

4

3 回答 3

4

=您正在尝试使用比较运算符来测试 null 。如果您使用 ANSI 空值,则任何nullfalse.

任何@studentId值(或)在哪里,以下表达式都是:nullfalse

@studentId = null  -- false
@studentId > null  -- false
@studentId >= null  -- false
@studentId < null  -- false
@studentId <= null  -- false
@studentId <> null -- false

所以,为了测试null你必须使用一个特殊的谓词is null,即:

@studentId is null
于 2013-07-08T19:51:12.667 回答
2

更短的方法:

create procedure usp_GetStudents @studentId int = null
as
  select * from Student 
  where studentId = isnull(@studentId,studentId)

如果 value 为 null,则不能使用=. 对于您的示例,您必须将条件替换@studentId = nullis null语法。

尝试如下更改您的代码:

create procedure usp_GetStudents @studentId int = null
as
  if (@studentId is null)
    select * from Student
  else
    select * from Student where studentId = @studentId
于 2013-07-08T19:42:52.500 回答
0

将 = 更改为is

create procedure usp_GetStudents @studentId int = null
as
  if (@studentId is null)
    select * from Student
  else
    select * from Student where studentId = @studentId
于 2013-07-08T19:54:37.683 回答