nombre maximal de paramètres dans la requête sql

J'expérimente avec LINQ depuis quelque temps. Méthode typique pour énumérer à travers une collection et changer certaines de ses propriétés dans mon code ressemblerait à:

ATDataContext dc = new ATDataContext(Settings.connection_string);

int[] col = ListViewClass.getListViewSelectedPositionTags(listView);

try
{
    foreach (var item in col)
    {
        var ctx = (from r in dc.MailingLists
                   where r.ID == item
                   select r).Single();

        ctx.Excluded = 'Y';
        ctx.ExcludedComments = reason;
    }

    dc.SubmitChanges();
}

un jour, j'ai eu un conseil pour le faire... semble comme beaucoup plus intelligent chemin:

var ctx = from r in dc.MailingLists
    where col.Contains(r.ID)
    select r;

foreach (var item in ctx)
{
    item.Excluded = 'Y';
    item.ExcludedComments = reason;
}

dc.SubmitChanges();

ça a du sens à bien des niveaux et j'adore cette solution. Il est intelligent et plus rapide que le premier.

j'ai utilisé cette solution dans un environnement de production pendant un certain temps.

quelle a été ma surprise après quelques semaines de recherche dans un fichier journal d'application et de voir ceci:

"le flux de protocole D'appel de procédure à distance (RPC) du flux de données tabulaires d'arrivée (TDS) est incorrect. Trop de paramètres ont été fournis dans cette demande de RCP. Le maximum est 2100."

LINQ to SQL convertit where col.Contains(r.ID) à IN clause ressemblant à quelque chose comme:

WHERE ID IN (@p1, @p1, @p2 ... )

la collection col a atteint (dans mon cas) plus de 2100 éléments et la requête a échoué. J'ai fait quelques recherches sur le problème et ce que j'ai est:

"... le nombre Maximum de paramètres dans la requête sql est de 2100. Il y a plus de limites, comme le fait que toute la chaîne de requête ne peut pas être plus longue que 8044 caractères."

j'ai tellement aimé la seconde solution. Je suis tellement déçu par ces limitations codées du serveur SQL.

ai-je manqué quelque chose? Y a-t-il quelque chose que je puisse faire pour pouvoir utiliser le "où col.Contient(R. ID) " version?

en ce qui Concerne Mariusz

ps. (J'utilise Win XP, C# avec LINQ et SQL 2005 Express).

27
demandé sur Eoin Campbell 2009-05-10 23:24:29

1 réponses

Les limites codés en dur :

  • paramètres par procédure stockée 2,100
  • paramètres par fonction définie par l'utilisateur 2 100

j'ai écrit un code avant de scinder la requête Contains en lots et de combiner les résultats... voir ici pour plus d' .

43
répondu Marc Gravell 2017-05-23 11:33:15