Asp.net SQL Server,其中字段为null或不为null,或两者都为null?
我对sql语句有相当恼人的问题。我正在使用存储过程(必须),不能使用动态sql 假设我有这张桌子: PEOPOLEAsp.net SQL Server,其中字段为null或不为null,或两者都为null?,asp.net,sql-server,stored-procedures,checkbox,parameter-passing,Asp.net,Sql Server,Stored Procedures,Checkbox,Parameter Passing,我对sql语句有相当恼人的问题。我正在使用存储过程(必须),不能使用动态sql 假设我有这张桌子: PEOPOLE ID NAME SURNAME MARRIED COMPANY PAYMENTID --------------------------------------------------- 1 Michael Backer 1 Google 1 2 Travis Morgan null null null 3
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的行。如果选中了两个复选框,则结果为整个表(id为1-4)。请记住,我有一个serach框,用于检查某些人的姓名,姓氏,所以这也在sql语句中
因为我不能传递像“IsNotNull”或“IsNull”这样的值,所以我怎样才能处理存储过程呢。有什么建议吗
搜索示例:
用户可以选择在搜索和检查支票盒中包含的公司和付款(始终至少每个公司和付款中的一个),查看婚姻状况。我将公司和付款参数传递给存储过程,并在对账单中使用它
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拆分解决了传入参数的问题(它可以工作)。从前端使用
DBNull.Value
示例:假设我有一个类,并且对象是AgeItem
具有属性AgeIndex
,我可以检查空值,如下所示
Parameter.Value = (object)AgeItem.AgeIndex ?? DBNull.Value;
在数据库中,检查参数中的空值
编辑1
我将把
WHERE
子句写为:
WHERE (@MarriageCheck IS NULL) or
(@MarriageCheck = 0 AND Marriage IS NULL) or
(@MarriageCheck = 1 AND Marriage IS NOT NULL)
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
)
其中@MarriageCheck
是类型为位的新参数。在C代码中正确设置该值应该是一种简单的条件逻辑:
(已更新,因此“两者”的处理方式与选中第一个复选框的处理方式相同)
通常,如果您还想进行其他形式的检查(例如,公司
),我会将WHERE
子句安排为:
WHERE (@MarriageCheck IS NULL) or
(@MarriageCheck = 0 AND Marriage IS NULL) or
(@MarriageCheck = 1 AND Marriage IS NOT NULL)
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
)
谢谢,但请您详细说明在存储过程中要做什么?我像这样传递参数:cmd.Parameters.Add(“@marriedcheck”,SqlDbType.NVarChar).Value=?;此外,我不知道我应该选择哪种类型,我thnik NvarChar是不合适的。varchar也将工作。如果未检查pass dbtyp.null,则在分配给参数时需要检查值。我使用@Damien_的注释解决了这个问题。但是需要sql(查找)方面的帮助。如果你有任何建议,请帮忙。谢谢您的时间。出于好奇,如果两个框都没有勾选,会发生什么?您似乎只有4个UI状态映射到3个搜索类型。谢谢您的警告。应该是第一个复选框被选中。有人吗?花了整整一个晚上来解决这个问题,但没有成功。如果只检查一个,效果会很好。如果两者都选中,则不起作用。我不知道其他状态下应该是什么(chckSecond.Checked?)。如果两个复选框都未选中,它应该像第一个复选框被选中一样。@michael24B-如果两个复选框都被选中,它就不应该进入If
块,它应该将参数的值保留为NULL
/DbNull
-这是我们希望它设置为包含两种结果类型的值。如果两者都选中,我会得到此异常:过程或函数“Procedure”预期参数“@MarriageCheck”,但未提供该参数。我添加了一个显式集,但我认为没有必要。您应该确保在SQL中,存储过程的参数声明为@MarriageCheck bit=null
,感谢您的提示,它对两个复选框都有效。但是还有一个问题。。用户也会搜索company,所以我有这样的程序:其中(@MarriageCheck为NULL,people.company在('Google')和people.anothercolumn('value'))或(@MarriageCheck=0,Marriage为NULL)或(@MarriageCheck=1,Marriage不为NULL,而people.company在('Google'))中)对于第一个checbox来说效果很好,但如果两者都被选中的话(所以第一行代码并不好,因为它只显示已婚人士。