Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Taille maximale pour une requête SQL Server ? Clause IN ? Est-ce qu'il y a une meilleure approche

Chaque lot SQL doit tenir dans la limite de taille de lot :65 536 * taille de paquet réseau.

En dehors de cela, votre requête est limitée par les conditions d'exécution. Il manquera généralement de taille de pile car x IN (a,b,c) n'est rien d'autre que x=a OR x=b OR x=c qui crée un arbre d'expression similaire à x=a OR (x=b OR (x =c)), donc ça devient très profond avec un grand nombre de OU. SQL 7 atteindrait un SO à environ 10 000 valeurs dans le IN, mais de nos jours, les piles sont beaucoup plus profondes (à cause de x64), donc cela peut aller assez loin.

Mettre à jour

Vous avez déjà trouvé l'article d'Erland sur le sujet de la transmission de listes/tableaux à SQL Server. Avec SQL 2008, vous disposez également de paramètres de table qui vous permettent de transmettre un DataTable entier en tant que paramètre de type de table unique et de le rejoindre.

XML et XPath sont une autre solution viable :

SELECT ...
FROM Table
JOIN (
   SELECT x.value(N'.',N'uniqueidentifier') as guid
   FROM @values.nodes(N'/guids/guid') t(x)) as guids
 ON Table.guid = guids.guid;