Изврат однозначно. К тому же не обойтись без хардкода.
Тема: подумай, как запрос разбить на подзапросы. Ну к примеру: там, где нужно обращаться к таблицам разных фирм - формируй строку запроса в Navi, а там, где данные в привязке к фирме уже не имеют значения - ваяй ХП (если это конечно возможно) и дёргай их в нужные моменты, передавая значения, полученые запросом, сгенеренным в Navi. Короче, тут совет может быть такого рода: пробуй комбинировать. Хотя, конечно, можно слабать внешнюю компоненту, в которую текст запроса передавать блоками по 1024 символа, а после того, как набор блоков передан - запускать метод компоненты, который вызовет исполнение собранного из блоков запроса. Это тоже изврат, но менее прибацаный.