Единственный способ сделать это - использовать хранимую процедуру CLR . Пусть sproc CLR вызовет sproc, который возвращает три таблицы. Затем возьмите только ту таблицу, которую вы хотите, и верните ее из своего модуля CLR. Вставьте результаты вашего CLR sproc в ваш @myTable. Я думаю, что это даст вам дополнительный уровень косвенности, необходимый для устранения несоответствия столбцов из двух других наборов результатов.
Хорошо, я создал сильно упрощенную версию для тестирования. Я возвратил два набора результатов из таблицы, один с одним столбцом и один с двумя ...
DECLARE @myTable TABLE ( col1 varchar(50) )
INSERT @myTable( col1 )
EXEC TestTable
Получает правильный результат ...
Сообщение 213, Уровень 16, Состояние 7, Процедура
TestTable, строка 23 Имя столбца или
количество введенных значений не
определение таблицы соответствий.
Я создал этот ответный запрос CLR, который берет только первый набор результатов (набор с одним столбцом) из моего тестового набора TSQL и возвращает только эту таблицу ...
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void FilterResult()
{
using (var conn = new SqlConnection("context connection = true"))
{
var retVal = new SqlDataRecord( new SqlMetaData("col1",
SqlDbType.NVarChar, 50));
conn.Open();
var cmd = new SqlCommand("exec TestTable", conn);
SqlContext.Pipe.SendResultsStart(retVal);
using (var dr = cmd.ExecuteReader())
{
while (dr.Read())
{
var tmpCol = dr.GetString(0);
retVal.SetString(0, tmpCol);
SqlContext.Pipe.SendResultsRow(retVal);
}
dr.Close();
}
SqlContext.Pipe.SendResultsEnd();
}
}
};
Тогда я могу выполнить ...
INSERT @myTable( col1 )
EXEC TestFilter -- note the CLR sproc here instead of the TSQL sproc
... и все счастливы ...
(затронуто 2 строк)
В конце концов, это может быть больше проблем, чем стоит, но это работает как доказательство концепции. (Нет гарантии относительно производительности.)