sql >> データベース >  >> RDS >> Sqlserver

パラメータ化された動的SQLクエリ

    ここでいくつか間違ったことをしています:

    • すべてのパラメータに同じ名前を付けます@searchitem 。それはうまくいきません。パラメータには一意の名前が必要です。
    • アイテムごとに新しいSqlCommandを作成します。それはうまくいきません。 SqlCommandを1回作成します ループの開始時にCommandTextを設定します SQLの作成が完了したら。
    • SQLはANDで終わります 、これは有効な構文ではありません。

    改善の提案(それ自体は間違っていませんが、ベストプラクティスでもありません):

    • Frederikが提案したように、通常の方法は%を配置することです。 SQL内で文字列の連結を行うのではなく、パラメータ内のトークン。
    • データベースで大文字と小文字を区別する照合を明示的に使用しない限り、比較では大文字と小文字を区別しない必要があります。したがって、LOWERは必要ない場合があります 。

    コード例:

    SqlCommand cmd = new SqlCommand();
    StringBuilder sqlBuilder = new StringBuilder();
    sqlBuilder.Append("SELECT name, memberid FROM members ");
    
    var i = 1;
    foreach (string item in keywords)
    {
        sqlBuilder.Append(i == 1 ? " WHERE " : " AND ");
        var paramName = "@searchitem" + i.ToString();
        sqlBuilder.AppendFormat(" Name LIKE {0} ", paramName); 
        cmd.Parameters.AddWithValue(paramName, "%" + item + "%");
    
        i++;
    }
    cmd.CommandText = sqlBuilder.ToString();
    


    1. PostgreSQL:エラー:演算子が存在しません:整数=文字が変化します

    2. 均等なサイズのグループを作成する方法

    3. 列値をサブストリングとするPostgresLIKE

    4. 1つのSQLクエリに複数の行を挿入しますか?