2011-11-08 16 views
14

Estoy cargando diferentes consultas en un SqlCommand deteniendo el lote de consultas cuando llego al límite de 2100 parámetros. Si mi lote tiene parámetros 2100 o 2099, aún recibo la excepción.Excepción de parámetros máximos de SqlCommand en 2099 parámetros

El siguiente código de prueba lanza 'demasiados parámetros excepción', incluso si el número de parámetros es inferior a 2100.

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. 

Teniendo en cuenta el mensaje de excepción y la documentación aquí: http://msdn.microsoft.com/en-us/library/ms143432.aspx que estaba esperando para poder tiene 2100 parámetros en una consulta, pero esto no parece ser cierto. ¿Alguien sabe por qué? ¿Me estoy perdiendo de algo?

(estoy usando SQL Server 2008 R2)

+3

¿Para qué está utilizando esta gran cantidad de parámetros? ¿Ha considerado utilizar un parámetro con valores de tabla en su lugar? –

+0

Funciona con 2098/2097/etc. Creo que hay un parámetro ReturnValue que SQL tenía de forma predeterminada. –

+0

No puedo usar eso por diseño, estoy bien dividiendo las consultas en varios lotes. Solo quería saber por qué no puedo usar 2100 parámetros como dice. – marcob

Respuesta

19

El comando enviado a SQL Server es

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

Tenga en cuenta que 2 de las ranuras de los parámetros en la llamada a sp_executesql se toman con los NVARCHAR cuerdas para el texto de la consulta y las definiciones de los parámetros, por lo tanto "solo" dejando 2,098 gratis para que usted pueda usar.

+1

Estaba al frente de este error (hay demasiados parámetros en esta instrucción EXECUTE. El número máximo es 2100). Al darse cuenta de que el problema es el recuento de parámetros sp_executesql. ¡Muchas gracias! :) – marcob

+1

+1 para esta respuesta. Me pasó lo mismo conmigo. VS informó command.Parameters.Count era exactamente 2100 y SQL Server indicaba que tenía más de 2100 parámetros. Mi educación de tercer grado me dijo que algo andaba mal. Con algo de experimentación, descubrí que 2098 era la verdadera cantidad máxima de parámetros. Entonces, el mensaje de error es engañoso desde una perspectiva de ADO.NET por decir lo menos. Estoy configurando mi máximo en 2090 en caso de que Microsoft cambie su implementación de ADO.NET. –

Cuestiones relacionadas