-3

我正在使用带有 C# 前端的 SQL Server 2008。我正在尝试将 SQL 字符串从 C# 传递到 SQL Server,并且我的 WHERE 语句中有 2 个字段有时可能包含 NULL 值。我在代码隐藏中的页面加载中有此代码(这是用于将放置在数据网格中的报告):

    protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection sqlconnectionStatus = new SqlConnection(str);
        string DDL_Value = Convert.ToString(Request.QueryString["DDL_Val"]);
        string Val_Value = Convert.ToString(Request.QueryString["Val_Val"]);
        string Trk_Value = Convert.ToString(Request.QueryString["Trk_Val"]);
        string StDt_Value = Convert.ToString(Request.QueryString["StDt_Val"]);
        string EnDt_Value = Convert.ToString(Request.QueryString["EnDt_Val"]);

        string BTN_Value;
        // Because the date is stored as an INT, you have to request the string and then
        //   convert it to an INT
        string StDT_Vals = Request.QueryString["StDt_Val"].ToString();
        string EnDT_Vals = Request.QueryString["EnDt_Val"].ToString(); 
        string sqlquery;

            sqlquery = "Select DISTINCT PL.PROC_NM as Agent_Name, CCM.UNIQUE_CLAIM_ID as Unique_ID, CCM.CLAIM_ID as Claim_Number, ";
            sqlquery = sqlquery + "CCM.SOCSEC as Employee_Last_Digit, CCM.DATE_IMPORTED as Import_Date, CCM.Orig_Open_Date as Original_Review_Date, ";
            sqlquery = sqlquery + "AGL.ACCT_GRP as Account_Name, AL.ACCT_NUM as Account_Number, CCM.CDBBEN as Benefit_Option, CCM.BENEFIT_TYPE1 as Benefit_Type1, ";
            sqlquery = sqlquery + "CCM.BENEFIT_TYPE2 as Benefit_Type2, CCM.BENEFIT_TYPE3 as Benefit_Type3, CCM.Cmplt as Review_Validated, CCM.Vldtn_Cmmnts as Validation_Comments, ";
            sqlquery = sqlquery + "CCM.Gtkpr_Cmmnts as Gatekeeper_Comments, TS.StatusText as Tracking_Status ";
            sqlquery = sqlquery + "from ClosedClaims_MERGE CCM ";
            sqlquery = sqlquery + "LEFT JOIN PROC_LIST PL ON CCM.Spare = PL.LOGIN ";
            sqlquery = sqlquery + "LEFT JOIN ACCT_LIST AL ON AL.ACCT_NUM = CCM.CDBACC ";
            sqlquery = sqlquery + "LEFT JOIN ACCT_GRP_LIST AGL ON AGL.ACCT_GRP_PK = AL.ACCT_GRP_FK ";
            sqlquery = sqlquery + "LEFT JOIN TrackingStatus TS ON TS.StatusCode = CCM.TrackingStatus ";
            sqlquery = sqlquery + "WHERE CCM.Spare LIKE '" + DDL_Value + "' AND CCM.Cmplt LIKE '" + Val_Value + "' AND CCM.TrackingStatus IN (" + Trk_Value + ") AND CCM.DATE_IMPORTED >= '" + StDt_Value + "' AND CCM.DATE_IMPORTED <= '" + EnDt_Value + "'";
    }

该代码是合理的,如果为所有报告参数选择了一个值,它就可以正常工作。问题是 CCM.Spare 和 CCM.Cmplt 可以从下拉列表中选择特定值,也可以将它们留空。如果留空,那么他们需要提取所有值,无论它们是否为 NULL。当我将一个(或两个)留空时,这就是 SQL 失败的地方。

我尝试检查空格并将变量设置为“%”,但这显然不起作用;它只会拾取字段中有值的记录。

如果可能的话,我想用一个语句来做到这一点,然后再用一些 If/Then/Else 循环来包含它。

这可能吗?

4

2 回答 2

1

试试这个,我刚刚包含了第一个标准的代码。如上所述,不要连接您的参数;第二种选择是最好的方法:

sqlquery = sqlquery + 
    "WHERE CCM.Spare " + (DDL_Value == null ? "IS NULL" : "LIKE '" + DDL_Value + "'") + " AND ...";
sqlquery = sqlquery + 
    "WHERE CCM.Spare " + (DDL_Value == null ? "IS NULL" : "LIKE @par1") + " AND ...";


另外,为了提高您的查询速度,您可以执行以下操作:

sqlquery = sqlquery + 
    "WHERE " + (DDL_Value != null ? "CCM.Spare LIKE @par1 AND " : "") + "...";

CCM.Spare如果您的参数为空,这将忽略整个标准。

于 2013-10-29T15:58:25.287 回答
1

如果您想要 CCM.Spare 和 CCM.Cmplt 的所有可能值,您只需省略谓词即可。构建一个单独的查询(最好使用参数化查询,正如 marc_s 指出的那样),省略WHERE引用空下拉值的子句。

于 2013-10-29T15:52:48.150 回答