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 null を使用している場合、 に対する比較は.nullfalse

任意@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
于 2013-07-08T19:51:12.667 に答える
2

それを行うより短い方法:

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

を使用して値が 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 に答える