如何处理动态sql参数

本文关键字:动态 sql 参数 处理 何处理 | 更新日期: 2023-09-27 18:17:52

处理动态sql参数的好方法是什么?

我有一个搜索表单,它接受了一大堆不同的搜索参数。如果参数是空的,我有参数在sql字符串它螺丝或减慢查询?

如何处理动态sql参数

根据具体的实现,我们有两种一般的方法来解决这个问题:

1)在跳过任何空参数的代码中动态地为SQL查询构建过滤器语句。如果您允许用户为单个列选择多个值(即选择50个州中的0个或多个来过滤数据),这是最好的方法。

例如:

假设txtCondition1和txtCondition2是文本框:

        // Assuming conn is an open SqlConnection
        System.Text.StringBuilder sbSQL = new StringBuilder(500);
        List<SqlParameter> cParameters = new List<SqlParameter>();
        // Add a default condition of 1=1 so that all subsequent conditions can be added 
        // with AND instead of having to check to see whether or not any other conditions
        // were added before adding AND.
        sbSQL.Append("SELECT * FROM MyTestTable WHERE 1 = 1 ");
        if (!String.IsNullOrEmpty(txtCondition1.Text)) {
            sbSQL.Append(" AND Column1 = @Column1");
            cParameters.Add(new SqlParameter("@Column1", txtCondition1.Text));
        }
        if (!String.IsNullOrEmpty(txtCondition1.Text))
        {
            sbSQL.Append(" AND Column2 = @Column2");
            cParameters.Add(new SqlParameter("@Column2", txtCondition2.Text));
        }
        SqlCommand oCommand = new SqlCommand(sbSQL.ToString, conn);
        if (cParameters.Count != 0) 
        {
            oCommand.Parameters.AddRange(cParameters.ToArray());
        } 
        // Do something with oCommand

2)如果值更有约束,我们通常将它们传递给存储过程,该过程负责通过测试参数的"空"来确定是否要对值进行评估,空参数是null,空字符串,0表示数字,等等。

可以做的一件事是检查参数是否传递给了存储过程。你可以这样做:

create procedure my_procedure (
  @param1 as int = null
  @param2 as int = null
) as 
begin
   select field1, field2, fieldn
     from table
    where ((@param1 is null) or (field2 = @param1))
      and ((@param2 is null) or (field2 = @param2))
end 

我宁愿在sql过程中这样做而不是在应用程序中