У меня есть некоторые 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 теоретически станет хранителем бизнес-логики, и из этого будет построена эффективная таблица (на основе всех известных комбинаций параметров). Конечно, если я могу упростить логику до реальной логической таблицы, это будет окончательный дизайн, но на данный момент это не предсказуемо.
Можете ли вы поделиться этой ошибкой? –
Маленькая шутка ушла, я предполагаю, что это сработает. –
Он говорил что-то вроде Expression Required в открывающей круглой скобке. –