2013-05-16 2 views
2

У меня есть два запроса, посещающих два разных SQL Server, чтобы избежать связи с сервером связи. Первый запрос получить список OrderIDs, я использую C# организовать их в строку, которая переходит на второй запрос, как показано в следующем формате:Максимальное количество элементов в ключе «в» для запроса с «Где»

Select ..... 
From ..... 
Where OrderID in (1,2,3,4,5,6) 

- 1,2,3,4,5,6 это процесс из результата первого запроса.

Я нашел, если есть много идентификаторов orderID, полученных из первого запроса, второй запрос будет тайм-аут.

Есть ли какая-либо практика, сколько элементов может пройти к разделу «IN»?

+1

У вас есть хороший индекс в столбце OrderID? –

+0

Похоже, что люди проверили это на: http://stackoverflow.com/questions/1869753/maximum-size-for-a-sql-server-query-in-clause-is-there-a-better- подход – dnord

+0

http://stackoverflow.com/questions/1069415/t-sql-where-col-in – bummi

ответ

3

Если вам нужно передать столько элементов, что это станет проблемой, вы должны рассмотреть хранимую процедуру с использованием определенного table valued parameter в качестве параметра (который должен содержать ваш список).

редактировать: см http://blogs.msdn.com/b/felixmar/archive/2010/10/27/how-to-create-and-execute-a-stored-procedure-using-a-table-as-a-parameter.aspx

+0

Конечной целью является использование связи Link Server. Таким образом, у меня есть две строки соединения, чтобы получить окончательный результат. Параметр table value должен хранить что-то в базе данных, но не имеет доступа ни к одному запросу. Один или запрос. Два –

+0

@HanYiZhang. Серверы не должны знать друг о друге.Я хочу сказать, что вы можете построить параметр table value в C# со значениями из первого запроса. Первый сервер не должен знать об этом. –

+0

Дэвид, спасибо! этот ответ достаточно точен для использования. Из приведенной ссылки ссылка на параметр значения таблицы не требует создания таблицы в любой базе данных до ее использования. Это очень аккуратно и полезно. –

-1

Это 2100 элементов. См. documentation.

+0

Пропуск больше, по-видимому, приведет к ошибке, но если его запрос тайм-аут, когда он проходит меньше ... – Servy

+1

«Параметры для определенной пользователем функции»? Это не то, что пользователь пытается сделать. –

1

Существует жесткое ограничение, но это очень высоко. Если вы достигнете этого предела, хотя он не будет тайм-аут, а скорее откажется позволить вам выполнить запрос вообще.

В вашем случае запрос просто занимает слишком много времени для запуска. Но чем больше элементов в вашем массиве «in», тем дольше ваш запрос будет выполняться, поскольку он имеет больше возможностей. Если ваш запрос занимает слишком много времени, он будет тайм-аут, как вы нашли.

Речь идет не о границах, а о допуске.

Что вы должны попробовать сделать, это разбиение на страницы ваших запросов, поэтому вы ограничиваете их до 100 строк и одновременно выполняете несколько запросов.

Возможно, вы также захотите использовать ORM как Entity Framework (у вас есть тег C#, но здесь нет C#, поэтому я предполагаю, что это то, что вы в нем), - тогда это выглядело бы как-то вроде это:

Orders.Where(o => OrderIDs.Contains(o.OrderID)).Skip(100).Take(100); 

это мое личное предубеждение, хотя так щепотку соли, чтобы бы ли не было бы хорошо для вас сделать.

Смежные вопросы