Возможно, ваш подход неправильный, через некоторое время я углублюсь в детали, но кажется, что ваша проблема может быть решена с помощью SSIS
- Обновленный ответ :
Во-первых, общая картина:
Наиболее доступным способом динамической обработки таблиц является использование сценария вместо хранимой процедуры.Если вы хотите, чтобы доступ к таблице выбирался случайным образом, вы, безусловно, не будете использовать никаких преимуществ производительности хранимых процедур, то есть планов выполнения.Сценарий SQL можно легко обновить, чтобы он указывал на одну таблицу во время выполнения, используя заполнители и заменяя ее перед выполнением.
Сценарий можно загрузить из файловой системы, переменной, текстового столбца в таблице и т. Д. ЗагрузкаПроцесс заключается в чтении содержимого скрипта в строковую переменную.Этот шаг выполняется один раз.
Следующим шагом является этап подготовки.Этот шаг будет выполнен для каждой таблицы, которая будет обработана.Основная задача этого шага - заменить заполнители таблицы текущей обрабатываемой таблицей.Также возможно установить значения параметров как любой параметр, который вам может понадобиться передать в sp, который вы уже написали.
Последний шаг - это выполнение скрипта.Так как уже загружен в переменную и заполнители были установлены на текущее имя таблицы, вы можете безопасно вызвать ExecuteSQLTask с переменной sql в качестве входных данных.Этот процесс, конечно, происходит для каждой таблицы, которую вы хотите обработать.
Хорошо.Теперь давайте посмотрим на это в действии.
Это пример модели базы данных:
CREATE TABLE [dbo].[t_n](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[start] [datetime] NULL,
CONSTRAINT [PK_t_n] PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY]
, где t_n представляет любую таблицу (t_1, t_2, t_3 и т. Д.).
Это ваша текущая хранимая процедура:
CREATE PROCEDURE SpProcessT_n
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM [t1];
END
GO
Теперь, преобразуйте эту хранимую процедуру в скрипт Sql, поместив вместо имени таблицы заполнитель
SET NOCOUNT ON;
SELECT * FROM [$table_name];
Я хочу сохранить это вфайл .sql в файловой системе, чтобы максимально упростить POC.
Затем создайте пакет служб SSIS следующим образом:

Это настройкиЯ выбираю настройку цикла: 
И это способ, которым вы можете назначить имя таблицы для переменной с соответствующим именем _table_name_ 
Это настройка скриптаЗдесь вы обнаружите, что переменная _table_name_ имеет доступ только для чтения, а новая переменная с именем SqlExec имеет доступ для чтения / записи:

И это ее основная функция:
public void Main()
{
String Table_Name = Dts.Variables["table_name"].Value.ToString();
String SqlScript;
Regex reg = new Regex(@"\$table_name", RegexOptions.Compiled);
using (var f = File.OpenText(@"c:\sqlscript.sql")) {
SqlScript = f.ReadToEnd();
f.Close();
}
SqlScript = reg.Replace(SqlScript, Table_Name);
Dts.Variables["SqlExec"].Value = SqlScript;
Dts.TaskResult = (int)ScriptResults.Success;
}
Вы можете заметить, что переменная Dts SqlExec содержитs SQL-скрипт, который будет выполнен.Теперь вы можете установить следующие параметры в вашем ExecuteSqlTask:

Успешно протестировано в MSSQL 2008, если вы вставите вставку в файл скрипта, вы увидите новые строки в каждой таблице.
Надеюсь, это поможет!