2011-11-08 3 views
14

하나의 SqlCommand에서 다른 쿼리를 일괄 처리하여 2100 매개 변수 제한에 도달했을 때 쿼리 일괄 처리를 중지합니다. 내 배치 2100 또는 2099 매개 변수가있는 경우 나는 여전히 예외가 발생합니다. http://msdn.microsoft.com/en-us/library/ms143432.aspx 내가 할 수있을 것으로 기대 된 다음 테스트 코드는 매개 변수의 수 미만 21002099 매개 변수에서 SqlCommand 최대 매개 변수 예외

var parametersMax = 2099; 

var connection = new SqlConnection(@"Data Source=.;Integrated Security=SSPI;"); 
connection.Open(); 

var enumerable = Enumerable.Range(0, parametersMax); 

var query = string.Format("SELECT {0}", String.Join(", ", enumerable.Select(s => string.Format("P{0} = @p{0}",s)))); 

var command = new SqlCommand(query, connection); 

foreach(var i in enumerable) 
    command.Parameters.Add(string.Format("p{0}",i), i); 

// here: command.Parameters.Count is 2099 

var reader = command.ExecuteReader(); // throws: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100. 

는 예외 메시지 여기 설명서를 고려하더라도 '너무 많은 매개 변수 예외'가 발생

하나의 쿼리에 2100 개의 매개 변수가 있지만 이는 사실이 아닌 것 같습니다. 아무도 이유를 아나요? 내가 놓친 게 있니?

는 SQL Server로 전송

+3

무엇이 많은 매개 변수를 사용하고 있습니까? 대신 테이블 반환 매개 변수 사용을 고려해 보셨습니까? –

+0

2098/2097/etc와 함께 작동합니까? 기본적으로 SQL에있는 ReturnValue 매개 변수가 있다고 생각합니다. –

+0

의도적으로 사용할 수는 없지만 여러 배치로 쿼리를 분할해도 괜찮습니다. 나는 왜 내가 2100 매개 변수를 사용할 수 없는지 알고 싶다. – marcob

답변

19

명령은 sp_executesql에 대한 호출의 매개 변수 슬롯 2는 NVARCHAR 문자열로 채택되어

exec sp_executesql 
      N'SELECT P0 = @p0, P1 = @p1, P2 = @p2...', 
      N'@p0 int,@p1 int,@p2 int...', 
      @p0=0,@p1=1,@p2=2... 

주이다 (I에서는 SQL Server 2008 R2를 사용하고 있습니다) 따라서 쿼리 텍스트와 매개 변수 정의는 "단지"2,098을 무료로 사용할 수 있습니다.

+1

문제가 sp_executesql 매개 변수 개수라는 ​​것을 알면이 오류 앞에있었습니다 (이 EXECUTE 문에는 매개 변수가 너무 많습니다. 최대 개수는 2100 개입니다). 감사합니다. :)이 대답은 – marcob

+1

+1입니다. 나는 똑같은 일이 일어나고 있었다. VS는 command.Parameters.Count가 정확히 2100이고 SQL Server가 2100 개 이상의 매개 변수를 가지고 있음을 나타냅니다. 제 3 학년 교육에 뭔가 잘못되었다고 들었습니다. 몇 가지 실험을 통해 2098이 매개 변수의 실제 최대 수임을 알게되었습니다. 따라서 오류 메시지는 ADO.NET 관점에서 오해의 소지가 있습니다. Microsoft에서 ADO.NET 구현을 변경 한 경우 최대치를 2090으로 설정합니다. –

관련 문제