Ограничение на то, где col в состоянии ( ... )


Я использую следующий код:

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

однако, если я положил более ~3000 чисел в IN предложение, SQL выдает ошибку.

кто-нибудь знает, есть ли ограничение по размеру или что-то подобное?!!

6 57

6 ответов:

в зависимости от используемого компонента database engine длина инструкции может быть ограничена.

SQL Server имеет очень большой предел:

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

ORACLE имеет очень легкий для достижения предела на другой стороне.

Итак, для больших предложений IN лучше создать временную таблицу, вставить значения и выполнить соединение. Он также работает быстрее.

есть предел, но вы можете разделить ваши значения на отдельные блоки in ()

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

Вы делаете это неправильно.

Параметризуйте свой запрос и передайте идентификаторы с помощью Возвращающий Табличное Значение Параметр.

например, вы можете определить следующий тип

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

и иметь следующую хранимую процедуру

CREATE PROCEDURE sp__Procedure_Name
    @OrderIDs IdTable READONLY,
AS

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

в зависимости от вашей версии, используйте возвращающий табличное значение параметр в 2008 году или какой-либо подход, описанный здесь:

массивы и списки в SQL Server 2005

почему бы не сделать где в суб-выберите...

предварительный запрос во временную таблицу или что-то...

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething

затем...

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

вы можете использовать кортежи такой: Выберите * из таблицы Где (Col, 1) IN ((123,1),(123,1),(222,1),....)

нет никаких ограничений на их количество. Он сравнивает пары.