2009-06-22 4 views
20

Une requête de recherche a renvoyé cette erreur. J'ai un sentiment parce que la clause in est ginormous sur un objet subordonné, quand j'essaye d'ORM l'autre objet.Trop de paramètres ont été fournis dans cette requête RPC. Le maximum est 2100.?

Apparemment, les clauses ne devraient pas être construites 1 paramètre à la fois. Merci ibatis.

+3

Vous allez devoir poster un peu de contexte. Votre question donne peu ou pas de sens (pas plus que votre énorme sujet). –

+2

Le titre est trop court – Dan

+0

wow! Je n'ai jamais su que vous pourriez passer 2100 paramètres dans la procédure !!!! –

Répondre

19

Votre meilleur pari est de réviser votre application pour transmettre moins de 2100 paramètres à la procédure stockée. Ceci est un DBMS limit that can't be raised.

8

Vous pouvez faire quelques petites choses:

  1. pompe, le params dans une table temporaire et à utiliser ladite table temporaire pour filtrer votre requête. Voir https://stackoverflow.com/a/9947259/37055
  2. Créez un tableau délimité par des virgules et passez le tableau dans SQL Server en tant que varchar (x). Séparez-le via TSQL (here are a few methods) et utilisez l'ensemble de lignes résultant pour filtrer vos résultats de recherche.
  3. Jetez un oeil à votre logique d'application. Il est plus qu'étrange de passer 2100 paramètres à une procédure stockée.
+0

Ce n'est pas si étrange ... un dans (@ p1, @ p2, ..., @ p2101) généré par un OR/M – JeremyWeir

+0

Ajout d'un lien vers l'exemple d'utilisation de # 1 –

-4

Si vous passez 2100 paramètres à une seule procédure stockée, vous faites simplement quelque chose de mal. Ne pas augmenter la limite ou essayer de contourner cette abomination, comprendre comment faire les choses correctement.

+5

-1 Si j'ai plus de 2100 lignes à supprimer (Par PK Id) comment est-ce une abomination? J'ai un système hautement transactionnel qui pousse les lignes au rythme de 400 par minute. Si les choses tournent au-delà de quelques minutes, mon processus de purge va facilement avoir plus de 2100 lignes qui ont besoin d'être nettoyées (et je ne peux pas nettoyer sur quoi que ce soit à l'exception de l'ID de la ligne). – Vaccano

+1

@Vaccano - d'abord, je ne suis pas fan de Linq (ou d'autres, liés, ORMs). En partie, c'est parce que la tentative de protéger les développeurs de SQL conduit à des «abominations» comme celle qui a fait surface ici.DevelopingChris n'a pas * créé * un sproc avec autant de params, son ORM l'a fait. Deuxièmement, il existe plusieurs façons d'aborder un problème comme le sien sans même penser à travailler à travers une procédure stockée avec plus de 2100 paramètres. Comme je l'ai dit, si votre esprit saute à une procédure stockée de 2100+ paramètres, construit dynamiquement comme une solution, alors vous avez vraiment besoin de réfléchir à nouveau. De toute évidence, il existe de meilleures solutions. –

+0

Commentant sur un ancien poste, mais j'ai aussi rencontré le problème. À l'aide de Dapper.NET pour trouver les ID d'élément qui sont inactifs (~ 8000 d'un ensemble d'origine de ~ 30000). Puis en passant cette liste dans une section "where id not in()". Il a bombardé à ce stade avec le même message d'erreur. Aucune procédure stockée. Et en aucun cas Dapper.NET me protège du SQL. La requête est là. Cela dit, j'ai "fixé" en tirant tous les éléments, puis en faisant une déclaration LINQ de .Where (c =>! InactIds.Contains (c.Id)). Est-ce que je pourrais juste mettre la déclaration d'inactifs dans l'où? Classe d'objet sûr mais différent, différents critères – Robert

14

J'ai eu cette même erreur lors de l'utilisation d'une requête LINQ to SQL apparemment innocente. Je voulais juste récupérer tous les dossiers dont ids étaient parmi ceux stockés dans un tableau:

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

Il est avéré que le tableau ids avait plus de 2100 articles, et il semble que le DataContext ajoute un paramètre pour chaque élément dans le tableau dans la requête SQL résultante. À la fin, c'était un bogue dans mon code, car le tableau d'ids ne devait pas contenir autant d'éléments. Mais de toute façon, il convient de garder à l'esprit qu'une validation supplémentaire est nécessaire lors de l'utilisation de ces constructions dans LINQ to SQL.

+0

merci de valider la question, j'aimerais beaucoup que vous l'ayez upvote, puisque vous l'avez rencontré et il sera clairement utile à d'autres de rester dans l'historique de recherche du monde. – DevelopingChris

+0

Le même problème m'a mordu. Des suggestions pour une solution élégante? –

+0

Nevermind! trouvé une réponse ici sur StackOverflow: http://stackoverflow.com/questions/656167/hitting-the-2100-parameter-limit-sql-server-when-using-contains –

Questions connexes