问题与SQL Server中的where子句有关

时间:2012-10-24 11:04:25

标签: c# sql-server

我有一个表名学生(studentId,StudentName,Address,PhoneNo)

我提供了一个过滤器供用户从Combobox中仅选择StudentId以获取学生的详细信息...并生成报告。

我写了以下查询来获取学生详细信息:

(select * from Students where StudentId = stdId)

这里stdId是我从代码

传递的参数

如果我选择单个studentId,它可以正常工作....但是在用户选择Comobobox中我还提供了"ALL"如果用户从组合框中选择All我想要显示所有学生的详细信息

那么如果用户选择stdId,我应该在All传递什么?

我在C#中使用了内联查询(不使用SQL存储过程)

4 个答案:

答案 0 :(得分:6)

如果用户选择全部,请将NULL传递给@StudentId并将您的查询更改为:

select *
from Students
where (StudentId=@StudentId OR @StudentId IS NULL)

答案 1 :(得分:6)

你可以这样做。

SELECT * from Students s
WHERE s.studentId = ISNULL(@StudentId,s.studentId) 

当"所有"在组合框中选择@studentid参数中的传递null。如果你不能在参数中传递null然后传递-1或你的combox选项中不能包含的任何东西,并按照这样做:(如果-1 =全部)

 SELECT * from Students s
 WHERE s.studentId = @StudentId or @StudentId=-1

您也可以尝试Curt给出的答案。

答案 2 :(得分:4)

在存储过程标头中,更改@StudentId的定义,以便它可以作为NULL传递。

ALTER PROCEDURE dbo.WhateverYourProcedureIsCalled( @StudentId int  = null )

然后按如下所示更改WHERE子句

...

SELECT * from Students
WHERE @StudentId IS NULL OR StudentId = @StudentId

从代码中,如果传递了ALL,则可以省略设置@StudentId参数值的部分。如果未传递,SQL Server将使用默认值。

答案 3 :(得分:1)

如果查询中包含where子句,您还需要提供有效的参数值,因此当包含where子句时,不可能让所有学生都接受。

您需要根据组合框中选择的值来区分查询。您可以执行以下操作。

int studentId = 0;
//Where selectedValue comes from your combobox
Int32.TryParse(selectedValue, out studentId);
var query = "select * from Students";
if (studentId > 0)
{
  query = query + " where StudentId = @StudentId";
  //Remember to add studentId as parameter value
}