program story

Contains ()를 사용할 때 2100 매개 변수 제한 (SQL Server)에 도달

inputbox 2020. 12. 26. 10:02
반응형

Contains ()를 사용할 때 2100 매개 변수 제한 (SQL Server)에 도달


from f in CUSTOMERS
where depts.Contains(f.DEPT_ID)
select f.NAME

deptsIEnumerable<int>부서 ID 목록 ( )입니다.

이 쿼리는 큰 목록 (약 3000 개의 부서 ID)을 통과 할 때까지 잘 작동합니다. 그러면이 오류가 발생합니다.

들어오는 TDS (Tabular Data Stream) 원격 프로 시저 호출 (RPC) 프로토콜 스트림이 올바르지 않습니다. 이 RPC 요청에 너무 많은 매개 변수가 제공되었습니다. 최대 값은 2100입니다.

내 쿼리를 다음과 같이 변경했습니다.

var dept_ids = string.Join(" ", depts.ToStringArray());
from f in CUSTOMERS
where dept_ids.IndexOf(Convert.ToString(f.DEPT_id)) != -1
select f.NAME

사용 IndexOf()하면 오류가 수정되었지만 쿼리가 느려졌습니다. 이 문제를 해결할 다른 방법이 있습니까? 정말 고마워.


내 솔루션 (가이드-> Guid 목록) :

List<tstTest> tsts = new List<tstTest>();
for(int i = 0; i < Math.Ceiling((double)Guides.Count / 2000); i++)
{
    tsts.AddRange(dc.tstTests.Where(x => Guides.Skip(i * 2000).Take(2000).Contains(x.tstGuid)));
}
this.DataContext = tsts;

SQL로 쿼리를 작성하고 엔터티를 첨부하지 않는 이유는 무엇입니까?

Linq에서 일한 지 오래되었지만 여기에 있습니다.

IQuery q = Session.CreateQuery(@"
         select * 
         from customerTable f
         where f.DEPT_id in (" + string.Join(",", depts.ToStringArray()) + ")");
q.AttachEntity(CUSTOMER);

물론 주사로부터 보호해야하지만 그렇게 어렵지는 않습니다.


어딘가에이 문제를 해결하기 위해 이러한 문을 일괄 처리하는 기술이 있으므로 LINQKit 프로젝트 를 확인하고 싶을 것 입니다. 이 아이디어는 PredicateBuilder를 사용하여 로컬 컬렉션을 더 작은 덩어리로 나누는 것이라고 생각하지만 대신이 문제를 처리하는 더 자연스러운 방법을 찾고 있었기 때문에 솔루션을 자세히 검토하지 않았습니다.

불행히도 .NET Framework 4.0 또는 후속 서비스 팩에 대해이 문제를 해결할 계획이 없다는 내 제안대한 Microsoft의 응답으로 나타납니다 .

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=475984

최신 정보:

MSDN 포럼에서 LINQ to SQL 또는 ADO.NET Entity Framework 에서이 문제가 해결 될 것인지에 대한 토론을 열었습니다 . 이러한 주제에 대한 자세한 내용과 XML 및 SQL UDF를 사용하여 만든 임시 해결 방법을 보려면이 게시물을 참조하십시오.


비슷한 문제가 있었고 두 가지 방법으로 해결할 수 있습니다.

  1. 교차 방법
  2. ID에 가입

목록에없는 값을 얻기 위해 Except 메서드 또는 left join을 사용했습니다.

최신 정보

EntityFramework 6.2는 다음 쿼리를 성공적으로 실행합니다.

var employeeIDs = Enumerable.Range(3, 5000);
var orders =
    from order in Orders
    where employeeIDs.Contains((int)order.EmployeeID)
    select order;

Linq에서 생성 한 IN 문에 매개 변수로 전달하기 전에 부서 목록을 더 작은 집합으로 항상 분할 할 수 있습니다. 여길 봐:

큰 IEnumerable을 고정 된 항목 양의 작은 IEnumerable로 나눕니다.

참조 URL : https://stackoverflow.com/questions/656167/hitting-the-2100-parameter-limit-sql-server-when-using-contains

반응형