我的sql语句问题非常烦人。我正在使用存储过程(必须),我不能使用动态SQL。
假设我有这张表:
PEOPOLE
ID NAME SURNAME MARRIED COMPANY PAYMENTID
---------------------------------------------------
1 Michael Backer 1 Google 1
2 Travis Morgan null null null
3 George Marshall null null null
4 Trevor Rush 1 Microsoft 1
5 John Doe 1 IBM 2
我的ASP.NET(C#)站点上有两个复选框。首先是“已婚”,第二个是“未婚”。
如果用户仅检查第一个checbox结果是id为1和4的行,如果选中第二个checbox,则结果为id为2和3的行。如果检查了两个checbox,则结果为整个表(id为1- 4)。请记住,我有一个serach框,检查一些人姓,姓氏,所以这也是在sql语句。
如何通过存储过程设法完成我想要的操作,因为我无法传递'IS NOT NULL'或'IS NULL'之类的值。有什么建议吗?
搜索示例:
用户可以选择在哪个公司和付款中包含(始终至少其中一个),以便在搜索和检查checbox中查看婚姻状况。我将公司和付款参数传递给存储过程并在IN语句中使用它。
示例(最复杂的): 用户包括Google和Microosft以及所有paymentid-s搜索。如果两个婚姻checbox都是checekd(第一个和第二个),那么结果是ID为1,3的人,并且因为第二个checxbox也被检查2和3(公司是空值)。
示例:用户包括所有公司和所有paymentid-s,并仅检查第二个checbox,其中显示“未结婚”。因此,结果是ID为2和3的人。在这种情况下,您可以看到公司和paymentid-s并不重要,因为空值(可能的连接语句?)。
示例:用户包括所有公司和paymentid-s(或不包括),并且只为已结婚的人(第一个复选框)提供服务,因此结果是已婚人士和在选定公司工作的人员。
用户可以在每个场景中搜索姓名,姓氏等。
我的sql:
WHERE
(
(@MarriageCheck IS NULL) or
(@MarriageCheck = 0 AND Marriage IS NULL) or
(@MarriageCheck = 1 AND Marriage IS NOT NULL)
) and
(
people.company in ('Google') AND // google is parameter @companies
people.payment in ('1','2') AND // payment is parameter @payment (splited by , using xml)
people.name LIKE %Mic% AND
people.surname LIKE %bac%
...
)
仅供参考,因为并不重要:我解决了使用xml拆分传递IN参数(它有效)。
答案 0 :(得分:1)
从前端使用DBNull.Value
。
示例:假设我有一个类,对象是AgeItem
,其属性为AgeIndex
我可以检查空值,如下所示。
Parameter.Value = (object)AgeItem.AgeIndex ?? DBNull.Value;
在您的数据库中检查参数中的空值。
//check what you have to send value of null
//if null then pass BDNull.Value
//else the value
cmd.Parameters.Add("@marriedcheck", SqlDbType.NVarChar).Value=?;
答案 1 :(得分:1)
我会将WHERE
子句写成:
WHERE (@MarriageCheck IS NULL) or
(@MarriageCheck = 0 AND Marriage IS NULL) or
(@MarriageCheck = 1 AND Marriage IS NOT NULL)
其中@MarriageCheck
是bit
类型的新参数。在C#代码中正确设置该值应该是一个简单的条件逻辑:
cmd.Parameters.Add("@MarriageCheck",SqlDbType.Bit)
if(!(chkFirst.Checked&&chkSecond.Checked))
{
cmd.Parameters["@MarriageCheck"].Value = !chkSecond.Checked;
}
else
{
cmd.Parameters["@MarriageCheck"].Value = DBNull.Value;
}
(更新为“不”既被视为与选中第一个复选框一样)
通常,如果您还想进行其他形式的检查(例如company
),我会将WHERE
条款安排为:
WHERE
(
(@MarriageCheck IS NULL) or
(@MarriageCheck = 0 AND Marriage IS NULL) or
(@MarriageCheck = 1 AND Marriage IS NOT NULL)
) and
(
--Company conditions go in here
)