2017-11-29 10 views
-1

idList라는 int 목록이 있습니다. 해당 idList의 각 id에 대한 Tasks 테이블의 TaskState를 업데이트하고 싶습니다. 이것은 내 코드는 지금 모습입니다 : 업데이트 쿼리를 최적화하여 루프에서 실행 하시겠습니까?

using (SqlConnection dataconnection = new SqlConnection(DB)) 
{ 
    SqlCommand sqlCommandDelete = new SqlCommand() 
    { 
     Connection = dataconnection 
    }; 

    dataconnection.Open(); 

    foreach (var id in idList) 
    { 
     qlCommandDelete.CommandText = $"UPDATE Tasks SET TaskState = 2 WHERE TaskID = {id}"; 
     sqlCommandDelete.ExecuteNonQuery(); 
    } 
} 

지금 문제는 내가 확실하지 않다 루프 화재가 최적 때마다 쿼리를 실행하는 것입니다. 모든 업데이트 문을 연결하고 쿼리를 한 번만 실행하면 덜 무겁습니까?

+3

을 다음과 같이 다음 SQL 텍스트를 작성이

var ids = idList.Aggregate((x, y) => $"{x}, {y}") 

처럼 할 수있는, ", idList)})") – Evk

+0

TVP –

답변

2

당신은`$ 'UPDATE ... WHERE TaskID를 IN ({String.Join ("예를 들어

qlCommandDelete.CommandText = $"UPDATE Tasks SET TaskState = 2 WHERE TaskID in ({ids})"; 
+1

+1 TaskId가 Int와 같은 인젝션 세이프 타입이라고 가정하면 +1 할 수 있습니다. 'String.Join' 만 사용하면 연결 문제가 저장됩니다. 쿼리에는 [궁극적으로 크기 제한] (https://stackoverflow.com/a/8808935/314291)이 있으므로 많은 수의 TaskIds에서 일괄 처리가 여전히 필요할 수 있습니다. 문자열의 경우 매개 변수화가 필요합니다 (https://stackoverflow.com/a/337792/314291). – StuartLC