2009-07-01 16 views
50

estoy usando el siguiente código:Límite en la condición WHERE col EN (...)

SELECT * FROM table 
WHERE Col IN (123,123,222,....) 

Sin embargo, si pongo más de ~ 3000 números en la cláusula IN, SQL genera un error.

¿Alguien sabe si hay un límite de tamaño o algo similar?

+2

Divida los números en la cláusula IN entre grupos lo suficientemente grandes como para procesarlos y asínclelos al mismo tiempo. –

Respuesta

51

Dependiendo del motor de base de datos que esté utilizando, puede haber límites en la duración de una instrucción.

SQL Server tiene un límite muy grande:

http://msdn.microsoft.com/en-us/library/ms143432.aspx

Oracle tiene un muy fácil de llegar a límite en el otro lado.

Por lo tanto, para las cláusulas IN grandes, es mejor crear una tabla temporal, insertar los valores y hacer un JOIN. Funciona más rápido también.

+3

no es correcto. El tamaño máximo de la instrucción SQL o un lote es 65K * (tamaño de paquete de red que suele ser 4K) = más de 250 Mb ... http://msdn.microsoft.com/en-us/library/ms143432.aspx. –

+0

Estás condenado en el acto, completé la respuesta. Por cierto, en ORACLE el límite es MUY fácil de alcanzar !. – tekBlues

+0

Usar una tabla de temperatura fue mi solución perfecta, ¡salvó mi día! ¡Gracias! – Yaroslav

28

Hay un límite, pero se puede dividir sus valores en bloques separados de en()

Select * 
From table 
Where Col IN (123,123,222,....) 
or Col IN (456,878,888,....) 
+0

IN() no es SARGilable.Es mucho mejor que introduzcas tus parámetros en una tabla temporal o TVP y luego utilices INNER JOIN. –

+0

¿cuál es el límite de la consulta anterior? Me refiero a cuántas cláusulas IN puedo definir con O? –

3

Por qué no hacer un donde en un sub-select ...

Pre-consulta en una tabla temporal o algo ...

CREATE TABLE SomeTempTable AS 
    SELECT YourColumn 
    FROM SomeTable 
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething 

entonces ...

SELECT * FROM OtherTable 
WHERE YourColumn IN (SELECT YourColumn FROM SomeTempTable) 
+3

Es mejor hacer una unión a la tabla temporal que una subselección por lo general. – HLGEM

+0

¿Una cláusula de existir no sería aún mejor? – Lukazoid

7

Usted lo está haciendo mal.

Parametrice su consulta y pase los ID con Table Valued Parameter.

Por ejemplo, se podría definir el siguiente tipo de

CREATE TYPE IdTable AS TABLE (Id INT NOT NULL PRIMARY KEY) 

y tienen el siguiente procedimiento almacenado

CREATE PROCEDURE sp__Procedure_Name 
    @OrderIDs IdTable READONLY, 
AS 

    SELECT * 
    FROM table 
    WHERE Col IN (SELECT Id FROM @OrderIDs) 
+0

3 votos hacia abajo pero no hay comentarios, ¿alguien se preocupa de explicar? –

+1

No sé por qué está siendo rechazado porque esta es una solución completamente válida. Aunque cambiaría el 'Seleccionar ID FROM @ OrderIDs' a una unión. – Logan

+0

sé que esta es una respuesta anterior, pero ¿sabes qué le sucede a tus OrderIds? ¿permanece? o es simple un archivo temporal? –

-2

Puede usar tuplas como este: SELECT * FROM tabla DONDE (Col, 1) IN ((123,1), (123,1), (222,1), ....)

No hay restricciones en el número de estos. Compara pares.

+0

No, en SQL Server no puede. SQL Server usa T-SQL que no cumple con ANSI SQL (tampoco lo es con ningún otro dialecto). –

Cuestiones relacionadas