How to Use 'Like' with a parameter

后端 未结 3 1585
名媛妹妹
名媛妹妹 2020-12-21 10:56

I want to search for a number embedded in a string in a field in our log table using a parameter.

select * from vwLogs where log_time >\'02/24/2009\' and message lik

相关标签:
3条回答
  • 2020-12-21 11:28
    WHERE message like '%' + @ErrorMessage + '%'
    

    Based on your edit I don't immediately see what's causing your error, but I did spot two potential issues:

    1. It's not handling null ErrorNumbers correctly. I don't think this is it, because an empty string should still match everything for that query. But fixing the nulls will improve performance for that case.
    2. It's treating it as a numeric type rather than a varchar. This also has performance implications and might actually break the LIKE query: I don't recall what the behavior is off the top of my head.

    Try this:

    protected void btnRunQuery_Click(object sender, EventArgs e)
    {
        string strConn = @";";
        string strSQL =
             "SELECT * "
          + " FROM weblogs.dbo.vwlogs"
          + " WHERE Log_time >= @BeginDate AND Log_Time < @EndDate"
              + " AND (client_user=@UserName OR @UserName IS NULL)" 
              + " AND (message like '%' + @ErrorNumber + '%' OR @ErrorNumber IS NULL)"
          + " ORDER BY Log_time DESC";
    
        using (SqlConnection cn = new SqlConnection(strConn))
        using (SqlCommand cmd = new SqlCommand(strSQL, cn))
        {
            cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value =
                DateTime.Parse(txtBeginDate.Text).Date;
            cmd.Parameters.Add("@EndDAte", SqlDbType.DateTime).Value =
                // add one to make search inclusive
                DateTime.Parse(txtEndDate.Text).Date.AddDays(1);
            cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = 
                string.IsNullOrEmpty(txtUserName.Text) ? DBNull.Value : txtUserName.Text;
            cmd.Parameters.Add("@ErrorNumber", SqlDbType.VarChar, 50).Value =
                string.IsNullOrEmpty(txtErrorNumber.Text) ? DBNull.Value : txtErrorNumber.Text;
    
            cn.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
    
            GridView1.DataSource = rdr;
            GridView1.DataBind();
        }
    }
    

    BTW: didn't I give you that code in the first place? :)

    0 讨论(0)
  • 2020-12-21 11:28

    You are on the right path, but use it this way:

    SET @ErrorMessage = '%' + @ErrorMessage + '%'
    
    
    SELECT messageId FROM [yourTable]
    WHERE message like @ErrorMessage
    

    Otherwise the server will not be able to cache the execution plan

    0 讨论(0)
  • 2020-12-21 11:40

    or if @ErrorMessage contains the % already, e.g. @ErrorMessage = 'ABCD%' then this will also work

    ... WHERE message like @ErrorMessage
    
    0 讨论(0)
提交回复
热议问题