2011-11-08 1 views
14

Sto eseguendo il batching di query diverse in un unico SqlCommand, interrompendo il batch di query quando raggiungo il limite del parametro 2100. Se il mio batch ha parametri 2100 o 2099, ottengo comunque l'eccezione.SqlCommand eccezione dei parametri massimi ai parametri 2099

Il seguente codice di prova getta 'troppi parametri eccezione', anche se il numero di parametri è inferiore 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. 

Considerando il messaggio di eccezione e la documentazione qui: http://msdn.microsoft.com/en-us/library/ms143432.aspx mi aspettavo di essere in grado di avere 2100 parametri in una query, ma questo non sembra essere vero. Qualcuno sa perché? Mi sto perdendo qualcosa?

(sto usando SQL Server 2008 R2)

+3

Per cosa si utilizza questo numero elevato di parametri? Hai considerato di utilizzare un parametro con valori di tabella? –

+0

Funziona con 2098/2097/ecc. Penso che ci sia un parametro ReturnValue che SQL aveva per impostazione predefinita. –

+0

Non riesco a utilizzarlo in base alla progettazione, sto bene dividendo le query in più lotti. Volevo solo sapere perché non posso usare 2100 parametri come dice. – marcob

risposta

19

Il comando inviato a SQL Server è

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

noti che 2 degli slot parametro nella chiamata al sp_executesql sono presi con i NVARCHAR corde per il testo della query e le definizioni dei parametri quindi "solo" lasciando 2.098 liberi per l'uso.

+1

Ero di fronte a questo errore (Ci sono troppi parametri in questa istruzione EXECUTE: il numero massimo è 2100.) realizzando che il problema è il conteggio dei parametri sp_executesql. Grazie mille! :) – marcob

+1

+1 per questa risposta. Ho avuto la stessa cosa con me. VS ha riportato il comando.Parameters.Count era esattamente 2100 e SQL Server indicava che avevo più di 2100 parametri. La mia educazione di terza elementare mi ha detto che qualcosa non andava. Con alcuni esperimenti ho scoperto che 2098 era il vero numero massimo di parametri. Quindi, il messaggio di errore è fuorviante da una prospettiva ADO.NET a dir poco. Sto impostando il mio limite massimo a 2090 nel caso in cui Microsoft modifichi la propria implementazione di ADO.NET. –