복붙노트

[SQL] LIKE 및 IN 조건 매개 변수화 된 쿼리

SQL

LIKE 및 IN 조건 매개 변수화 된 쿼리

닷넷에서 매개 변수화 된 쿼리는 항상 예에서 다음과 같이 :

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID = @categoryid
", 
   conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;

그러나 나는 다음을 수행하려고 벽돌 벽 실행 해요 :

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID IN (@categoryids) 
      OR  name LIKE '%@name%'
", 
   conn);
comm.Parameters.Add("@categoryids", SqlDbType.Int);
comm.Parameters["@categoryids"].Value = CategoryIDs;
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = Name;

어디

이것에 대한 올바른 구문은 무엇입니까?

해결법

  1. ==============================

    1.하자는 정수 배열에 카테고리 ID를 가지고 이름 문자열이라고 말한다. 트릭은 개별 매개 변수로 카테고리 ID의 모든를 입력하고 이름에 대한 퍼지 일치를 구성 할 수 있도록 명령 텍스트를 만드는 것입니다. 전을 수행하기 위해 @ PN-1 N 어레이 카테고리 식별자의 개수를 통하여 P0 @ 파라미터 이름의 서열을 구성하는 루프를 사용한다. 그런 다음 우리는 매개 변수를 구성하고 각 명명 된 매개 변수에 대한 값으로 관련 카테고리 ID로 명령에 추가합니다. 그런 다음 우리는 이름에 퍼지 검색 할 수 있도록 쿼리 자체에 이름을 연결을 사용합니다.

    하자는 정수 배열에 카테고리 ID를 가지고 이름 문자열이라고 말한다. 트릭은 개별 매개 변수로 카테고리 ID의 모든를 입력하고 이름에 대한 퍼지 일치를 구성 할 수 있도록 명령 텍스트를 만드는 것입니다. 전을 수행하기 위해 @ PN-1 N 어레이 카테고리 식별자의 개수를 통하여 P0 @ 파라미터 이름의 서열을 구성하는 루프를 사용한다. 그런 다음 우리는 매개 변수를 구성하고 각 명명 된 매개 변수에 대한 값으로 관련 카테고리 ID로 명령에 추가합니다. 그런 다음 우리는 이름에 퍼지 검색 할 수 있도록 쿼리 자체에 이름을 연결을 사용합니다.

    string Name = "someone";
    int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
                                    1618, 1619, 1620, 1951, 1952,
                                    1953, 1954, 1955, 1972, 2022 };
    
    SqlCommand comm = conn.CreateCommand();
    
    string[] parameters = new string[categoryIDs.Length];
    for(int i=0;i<categoryIDs.Length;i++)
    {
       parameters[i] = "@p"+i;
       comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
    }
    comm.Parameters.AddWithValue("@name",$"%{Name}%");
    comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
    comm.CommandText += string.Join(",", parameters) + ")";
    comm.CommandText += " OR name LIKE @name";
    

    이것은 당신의 DBA의 행복을해야 완전히 매개 변수화 된 쿼리입니다. 나는 많은 보안 위험이되지 않을 것하지만 이러한 정수이기 때문에 아직 이름을 매개 변수화하는 동안 그냥 값으로 직접 명령 텍스트를 구성하는 것을 생각한다. 당신의 카테고리 ID를 문자열 배열에있는 경우, 다만, 쉼표의 배열을 분할 정수로 각각 변환하고 정수 배열에 저장합니다.

    참고 : 나는 배열을 말하고 예에서 사용하지만 반복이 다를 아마합니다 있지만 그것이 어떤 수집을 위해 작동합니다.

    http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9에서 원래의 아이디어

  2. ==============================

    2.당신은 SQL 매개 변수의 값에 "%"를해야합니다.

    당신은 SQL 매개 변수의 값에 "%"를해야합니다.

    SqlCommand comm = new SqlCommand("SELECT * FROM Products WHERE Category_ID IN (@categoryid1, @categoryid2) OR name LIKE @name", conn);
    comm.Parameters.Add("@categoryid1", SqlDbType.Int);
    comm.Parameters["@categoryid1"].Value = CategoryID[0];
    comm.Parameters.Add("@categoryid2", SqlDbType.Int);
    comm.Parameters["@categoryid2"].Value = CategoryID[1];
    comm.Parameters.Add("@name", SqlDbType.Int);
    comm.Parameters["@name"].Value = "%" + Name + "%";
    
  3. ==============================

    3.이 방법은 작동하지 않습니다. 기간.

    이 방법은 작동하지 않습니다. 기간.

    IN 절 당신이 그것을 하나 개의 매개 변수를 바인딩 할 때, 당신은 하나 개의 값을 전달 할 수있는 기회를 가지고, 매개 변수 자체의 목록을 기대하고있다.

    당신이 전달하고자하는 개별 IN 절 자리의 정확한 양, 동적 문 문자열을 빌드하고 루프에서 그들에게 매개 변수와 바인드 값을 추가합니다.

  4. ==============================

    4.확실하지이 올바른 방법이지만, 내가 전에 그것을 수행 한 방법 인 경우

    확실하지이 올바른 방법이지만, 내가 전에 그것을 수행 한 방법 인 경우

    목록 templist 새로운 목록을 =

    comm.Parameters.Add ( "@의 categoryids", SqlDbType.varchar); [ "categoryids @"] comm.Parameters. string.join 값 = ( ","templist.toarray ())

  5. from https://stackoverflow.com/questions/303149/parameterized-queries-with-like-and-in-conditions by cc-by-sa and MIT license