2009-02-13 5 views
0

У меня есть некоторые SQL, которая выполняет сложную логику на комбинации номеров счетов GL и центров затрат вроде этого:SSIS/VB.NET эквивалент SQL IN (анонимные array.Contains())

WHEN (@IntGLAcct In (
    882001, 882025, 83000154, 83000155, 83000120, 83000130, 
    83000140, 83000157, 83000010, 83000159, 83000160, 83000161, 
83000162, 83000011, 83000166, 83000168, 83000169, 82504000, 
82504003, 82504005, 82504008, 82504029, 82530003, 82530004, 
83000000, 83000100, 83000101, 83000102, 83000103, 83000104, 
83000105, 83000106, 83000107, 83000108, 83000109, 83000110, 
83000111, 83000112, 83000113, 83100005, 83100010, 83100015, 
82518001, 82552004, 884424, 82550072, 82552000, 82552001, 
82552002, 82552003, 82552005, 82552012, 82552015, 884433, 
884450, 884501, 82504025, 82508010, 82508011, 82508012, 
83016003, 82552014, 81000021, 80002222, 82506001, 82506005, 
82532001, 82550000, 82500009, 82532000)) 

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

Так что я делаю небольшую исследовательскую работу по перемещению ее в SSIS, чтобы увидеть, как это сделать по-другому. Внутри моей задачи сценария, однако, я должен использовать VB.NET, поэтому я ищу альтернативу этим:

Select Case IntGLAcct = 882001 OR IntGLAcct = 882025 OR ... 

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

Даже что-то вроде ({90605, 90607, 90610} AS List(Of Integer)).Contains(IntGLAcct) будет легче переносить, но я не могу заставить инициализатор дать мне анонимный массив. И есть так много этих маленьких коллекций, я не уверен, что смогу их создать заранее.

Это действительно все НУЖНО находиться в одном месте. Бизнес регулярно меняет эту логику. Моя стратегия заключалась в том, чтобы использовать udf для зеркалирования своего старого файла «include», но производительность была плохой. Теперь каждая из функций занимает всего 2 или три параметра. Оказывается, что в темном углу существующей системы они фактически строят таблицу из нескольких миллионов строк из всех этих результатов - даже несмотря на то, что таблица с заранее отложенной таблицей не используется много.

Итак, мой новый эксперимент заключается в том, что (поскольку я все еще строю массивную таблицу перекрестного соединения, чтобы согласовать эту часть процесса), используйте таблицу вместо кода, но продолжайте и заполняйте эту таблицу во время SSIS, вместо того, чтобы называть udf 12 миллионов раз, потому что моя версия udf просто перестала работать в течение разумного периода времени, и администраторы баз данных сейчас не очень помогают. Тем не менее, я знаю, что SSIS может обрабатывать эти строки довольно эффективно - поскольку каждый месяц я приношу известные хорошие результаты десятки многомиллионных таблиц строк из унаследованной системы за считанные минуты И запускать запросы, чтобы смириться с тем, что нет никаких отличий от новых версий ,

Код SSIS теоретически станет хранителем бизнес-логики, и из этого будет построена эффективная таблица (на основе всех известных комбинаций параметров). Конечно, если я могу упростить логику до реальной логической таблицы, это будет окончательный дизайн, но на данный момент это не предсказуемо.

ответ

1

Попробуйте это:

Array.IndexOf(New Integer() {90605, 90607, 90610}, IntGLAcct) >-1 
+0

Можете ли вы поделиться этой ошибкой? –

+0

Маленькая шутка ушла, я предполагаю, что это сработает. –

+0

Он говорил что-то вроде Expression Required в открывающей круглой скобке. –

0

Что делать, если вы использовали условное разделенное преобразование в своем входящем наборе данных, а затем использовали выражения или что-то подобное (я не уверен, что ваши учетные записи GL исправлены или если вы собираетесь динамически передавать их) для применения к результатам? Затем вы можете получить полученные данные и при необходимости обработать.

+0

Я знаю, где вы и откуда, но один из этих UDF, составляет 600 строк с 30 заявлений МИОНа и еще 1000 строк. Нам уже приходится повторно синхронизировать их каждый месяц с исходным файлом Focus include, чтобы наши результаты были точными до тех пор, пока не будет заменена старая система. –

+0

ugh, да. Это было бы довольно неприятно. Я вижу в других комментариях, что динамическое поколение массивов работает, поэтому Woo Hoo для этого! –

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

  • Нет связанных вопросов^_^