Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net SQL Server,其中字段为null或不为null,或两者都为null?_Asp.net_Sql Server_Stored Procedures_Checkbox_Parameter Passing - Fatal编程技术网

Asp.net SQL Server,其中字段为null或不为null,或两者都为null?

Asp.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

我对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的行。如果选中了两个复选框,则结果为整个表(id为1-4)。请记住,我有一个serach框,用于检查某些人的姓名,姓氏,所以这也在sql语句中

因为我不能传递像“IsNotNull”或“IsNull”这样的值,所以我怎样才能处理存储过程呢。有什么建议吗

搜索示例:

用户可以选择在搜索和检查支票盒中包含的公司和付款(始终至少每个公司和付款中的一个),查看婚姻状况。我将公司和付款参数传递给存储过程,并在对账单中使用它

  • 示例(最复杂的): 用户包括Google和Microosft以及搜索的所有paymentid-s。如果两个婚姻复选框都是checekd(第一个和第二个),则结果是ID为1、3的人,并且由于第二个复选框,所以也选中了2和3(其中company为空值)

  • 示例:用户包括所有公司和所有paymentid-s,并且只检查第二个复选框,上面写着“未结婚”。所以结果是ID为2和3的人。在这种情况下,您可以看到公司和paymentid-s并不重要,因为它们的值为null(可能是join语句?)

  • 示例:用户包括所有公司和工资SID-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拆分解决了传入参数的问题(它可以工作)。

    从前端使用
    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来说效果很好,但如果两者都被选中的话(所以第一行代码并不好,因为它只显示已婚人士。