2011-11-08 10 views
14

Pakuję różne zapytania w jednym SqlCommand, zatrzymując zadanie zapytań po przekroczeniu limitu parametrów 2100. Jeśli moja partia ma parametry 2100 lub 2099, nadal otrzymuję wyjątek.Wyjątek maksymalnych parametrów SqlCommand na 2099 parametrach

Poniższy kod badanie rzuca „zbyt wiele parametrów wyjątek” nawet jeśli liczba parametrów jest mniejsza niż 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. 

Uwzględniając komunikat wyjątku i dokumentację tutaj: http://msdn.microsoft.com/en-us/library/ms143432.aspx Spodziewałem się móc w jednym zapytaniu ma 2100 parametrów, ale nie wydaje się to prawdą. Czy ktoś wie, dlaczego? Czy czegoś brakuje?

(używam programu SQL Server 2008 R2)

+3

Do czego używasz tej dużej liczby parametrów? Czy zastanawiałeś się nad użyciem parametru o wartości tabeli? –

+0

Czy działa z 2098/2097/etc. Myślę, że istnieje parametr ReturnValue, domyślnie SQL. –

+0

Nie mogę tego użyć z założenia, nie mam problemu z dzieleniem zapytań w wielu partiach. Chciałem tylko wiedzieć, dlaczego nie mogę użyć 2100 parametrów, jak to jest napisane. – marcob

Odpowiedz

19

polecenia wysyłane do SQL Server jest

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

Należy pamiętać, że 2 szczelin parametrów w wywołaniu sp_executesql są pobierane z NVARCHAR strun dla tekstu zapytania i definicji parametrów "tylko" pozostawia 2,098 darmowych do użycia.

+1

Wystąpiłam przed tym błędem (w instrukcji EXECUTE znajduje się zbyt wiele parametrów, maksymalna liczba to 2100.), zdając sobie sprawę, że problemem jest liczba parametrów sp_executesql. Wielkie dzięki! :) – marcob

+1

+1 za tę odpowiedź. To samo działo się ze mną. Zgłoszone przez VS polecenie.Parameters.Count miało dokładnie 2100 i SQL Server wskazywał, że mam więcej niż 2100 parametrów. Moja edukacja na trzecim stopniu mówiła mi, że coś jest nie w porządku. Z niektórymi eksperymentami odkryłem, że 2098 to prawdziwa maksymalna liczba parametrów. Tak więc komunikat o błędzie wprowadza w błąd z perspektywy ADO.NET, mówiąc delikatnie. Ustawiam maksimum na 2090 na wypadek, gdyby Microsoft zmienił implementację ADO.NET. –

Powiązane problemy