2013-10-06 4 views
1

Как вы можете выбрать более чем 2100 значений?Выберите IN на более чем 2100 значениях

<cfquery name="result.qryData"> 
    SELECT sub_acct_no, ... 
    FROM dbo.Closed_ORDER 
    WHERE ord_no IN <cfqueryparam cfsqltype="CF_SQL_varchar" value="#ValueList(qryOrd.ord_no)#" list="yes"> 
</cfquery> 

Из-за способов настройки таблиц подключенные серверы и JOINS не являются опцией.

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

+2

Каждая система SQL, с которой я работал, ограничивает использование 'IN', как правило, около 1000 значений. Способ сделать это - создать таблицу - при необходимости - и использовать JOIN. Если ничего больше, это намного быстрее, чем предложение 'IN'. –

+0

Похоже, вам может потребоваться переоценить структуру вашей таблицы, если JOINs не являются опцией. –

+0

Соединения не являются опцией, поскольку исходная БД и целевая БД находятся на двух разных серверах, и они не разрешают связанным серверам –

ответ

4

сначала загрузить значения в XML

<cfset var strResult = '<ul class="xoxo">'> 
<cfloop query="qryOrd"> 
    <cfset strResult &= '<li>#xmlformat(ord_no)#</li>'> 
</cfloop> 
<cfset strResult &= '</ul>'> 

Затем с помощью XML в запросе SQL

<cfquery name="result.qryData"> 
DECLARE @xmlOrd_no  xml = <cfqueryparam cfsqltype="CF_SQL_varchar" value="#strResult#"> 


DECLARE @tblOrd_no   TABLE (ID varchar(20)) 


INSERT INTO @tblOrd_no 
SELECT tbl.Col.value('.', 'varchar(20)') 
FROM @xmlOrd_no.nodes('/ul/li') tbl(Col) 


SELECT sub_acct_no, ... 
FROM dbo.Closed_ORDER 
WHERE ord_no IN (SELECT ID FROM @tblOrd_no) 
</cfquery> 

Вы также можете сделать дамп XML и правильно отформатирован в HTML

<cfoutput>#strResult#</cfoutput> 
+2

FYI, другая альтернатива - [с использованием 'WITH' вместо дополнительной табличной переменной] (https://gist.github.com/anonymous/6860375). Я бы также выполнил план выполнения, чтобы узнать, быстрее ли 'JOIN' или' IN'. – Leigh

+1

Bah .. ужасный набор. Я имел в виду «* проверить * план выполнения», чтобы узнать, какая из них более эффективна. – Leigh