2009-06-22 1 views
20

Zapytanie wyszukiwania zwróciło ten błąd. Mam to uczucie, ponieważ klauzula in jest gigantyczna na obiekcie podrzędnym, kiedy próbuję ORM innego obiektu.Podano zbyt wiele parametrów w tym żądaniu RPC. Maksymalna jest 2100.?

Podobno w klauzulach nie należy budować po jednym parametrze na raz. Dzięki ibatis.

+3

Będziesz musiał opublikować jakiś kontekst. Twoje pytanie nie ma większego znaczenia lub nie ma znaczenia (ani nie ma twojego ogromnego tematu). –

+2

Tytuł jest za krótki – Dan

+0

wow! Nigdy nie wiedziałem, że możesz przejść 2100 parametrów do procedury !!!! –

Odpowiedz

8

można zrobić kilka rzeczy:

  1. Pompa params do tabeli temp i stosowania wspomnianej tabeli temp filtrować zapytanie. Zobacz https://stackoverflow.com/a/9947259/37055
  2. Utwórz tablicę rozdzielaną przecinkami i przekaż ją do SQL Server jako varchar (x). Podziel go za pomocą TSQL (here are a few methods) i użyj wynikowego zestawu wierszy do filtrowania wyników wyszukiwania.
  3. Zobacz logikę aplikacji. To trochę dziwne, gdy przechodzimy 2100 parametrów do procedury przechowywanej.
+0

To nie jest dziwne ... in (@ p1, @ p2, ..., @ p2101) wygenerowane przez OR/M – JeremyWeir

+0

Dodano link do przykładowego użycia # 1 –

-4

Jeśli przechodzisz 2100 parametrów do pojedynczej procedury przechowywanej, robisz coś złego. Nie podnoś limitu ani nie próbuj obejść tej obrzydliwości, znajdź sposób na poprawne działanie.

+5

-1 Jeśli mam ponad 2100 wierszy do usunięcia (Według PK Id) Jak to jest, że obrzydliwość? Mam wysoce transakcyjny system, który przesuwa wiersze z szybkością 400 na minutę. Jeśli wszystko toczy się dłużej niż kilka minut, mój proces oczyszczania będzie miał łatwo ponad 2100 wierszy, które wymagają oczyszczenia (i nie mogę posprzątać w oparciu o nic oprócz identyfikatora wiersza). – Vaccano

+1

@Vaccano - po pierwsze, nie jestem fanem Linq (lub innych, powiązanych, ORMów). Po części dlatego, że próba ochrony programistów przed SQL prowadzi do "obrzydliwości", takiej jak ta, która pojawiła się tutaj.DevelopingChris nie * utworzył * sproca z wieloma paramami, tak samo jak ORM. Po drugie, istnieje wiele sposobów radzenia sobie z problemem, takim jak jego, bez myślenia o procedurze przechowywanej z 2100+ parametrami. Jak już mówiłem, jeśli twój umysł skacze do parametru 2100+, dynamicznie konstruowanej procedury przechowywanej jako rozwiązania, to naprawdę musisz pomyśleć jeszcze raz. Oczywiście istnieją lepsze rozwiązania. –

+0

Komentując stary post, ale też natknąłem się na ten problem. Użycie Dapper.NET do znalezienia identyfikatorów przedmiotów nieaktywnych (~ 8000 oryginalnego zestawu ~ 30000). Następnie przekazując tę ​​listę do sekcji "where id not not()". W tym momencie został zbombardowany z tym samym komunikatem o błędzie. Bez procedury przechowywanej. I w żaden sposób Dapper.NET nie chroni mnie przed SQL. Zapytanie tam jest. Powiedziałem, że "naprawiłem", ściągając wszystkie elementy, a następnie wykonując instrukcję LINQ .Where (c =>! InactIds.Contains (c.Id)). Czy mógłbym umieścić oświadczenie dotyczące braku aktywności w miejscu, w którym? Pewnie, ale inna klasa pozycji, różne kryteria – Robert

14

Mam ten sam błąd, gdy używam pozornie niewinnego zapytania LINQ do SQL. Chciałem tylko, aby pobrać wszystkie rekordy, których identyfikatory były wśród tych przechowywanych w tablicy:

dataContext.MyTable.Where(item => ids.Contains(item.Id)).ToArray(); 

okazało się, że tablica identyfikatorów miał ponad 2100 elementów, a wydaje się, że DataContext dodaje jeden parametr dla każdego element w tablicy w wynikowym zapytaniu SQL.

Na koniec był to błąd w moim kodzie, ponieważ tablica ids nie miała tak wielu pozycji. Ale w każdym razie warto pamiętać, że potrzebna jest dodatkowa weryfikacja, gdy używamy takich konstruktów w LINQ do SQL.

+0

dziękuję za walidację tego pytania, chciałbym, jeśli go przegłosujesz, bo wpadłeś na to i będzie to wyraźnie pomocne dla innych, aby mógł pozostać w historii wyszukiwania na świecie. – DevelopingChris

+0

Ten sam problem przygryzł mnie. Wszelkie sugestie dotyczące eleganckiego rozwiązania? –

+0

Nieważne! znalazłem odpowiedź tutaj na StackOverflow: http://stackoverflow.com/questions/656167/hitting-the-2100-parametr-limit-sql-server-when-using-contains –