2015-11-09 3 views
0

Я пытаюсь написать макрос для запроса из нашей базы данных, используя предложение IN, за исключением одной проблемы. Я достигаю предела в предложении IN для SQL Server.Работать с ограничением предложения 'IN'

Мой макрос выглядит следующим образом:

Dim row_count As Double 
row_count = ActiveSheet.UsedRange.Rows.Count - 1 
half_row_count = row_count 
Dim i As Double 
Dim products As String 
For i = 2 To half_row_count 
    Dim product_id As String 
    product_id = Cells(i, 1).Value 
    'test = sixtyDays(product_id, conn) 
    'Cells(i, 10).Value = test 
    products = products & "'" & product_id & "'" & ", " 
Next i 
Dim sample As New ADODB.Recordset 
products = Left(products, Len(products) - 2) 
Set sample = sixtyDays(products, conn) 
Sheets(1).Range("K2").CopyFromRecordset sample 
conn.Close 

Function sixtyDays(ProductID As String, new_conn As ADODB.Connection) As ADODB.Recordset 
    Dim sConnString As String 
    Dim rst As New ADODB.Recordset 
    Dim recordsAffecfted As Long 
    StrQuery = "SELECT ProductAnalysisByMonth.SalesQty FROM ProductAnalysisByMonth WHERE ProductAnalysisByMonth.ProductID IN (" + ProductID + ") AND ProductAnalysisByMonth.Month = " + CStr(Month(Date) - 2) 
    rst.Open StrQuery, new_conn 
    Set sixtyDays = rst 
End Function 

Так что мне нужно, как некоторые разбить запрос на более мелкие куски, за исключением того, число аргументов, передаваемых в запросе SQL будет меняться от недели к неделе.

Каков наиболее эффективный способ решения этой проблемы?

+0

Я не испытал это лично, но я бы проверить здесь: http://stackoverflow.com/q/1069415/1316573 –

+0

Может вы просто 'union' два (или более) запросов, каждый из которых остается ниже предела для предложения 'IN' в SQL Server. (предел в Oracle - 1000, я не уверен, что это такое для SQL Server) – Marc

+1

Не можете ли вы просто написать его как два отдельных предложения IN с помощью OR? EG: WHERE (item in ('A', 'B', ....) OR item in ('X', 'Y', ....)) AND ... –

ответ

2

Создайте функцию таблицы, которая вернет результаты вашей строки в набор данных, который может быть вставлен в CTE, временную таблицу или использоваться непосредственно в соединении. Это был самый эффективный способ обойти это ограничение. Ниже приведена ссылка на сайт Ole Michelsen, который предоставляет простое, но гибкое решение.

Ссылка: http://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql.html

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