После просмотра трассировки Профилировщика, первая ошибка говорила, что одна из временных таблиц была недопустимым объектом.Я явно создал таблицу в процедуре вместо использования оператора «Вставить в», и это исправило ее.
Странно, как этого не произошло ни с одним из других операторов «вставки» в любом из процедур.
Редактировать:
После более подробного изучения, это происходит потому, что и у родителя, и у потомка временная таблица имеет одно и то же имя, а дочерний процесс обновляет свою временную таблицу любыми столбцами, которые нене существует во временной таблице родителя.
Игрушечный код:
CREATE PROCEDURE parent
AS
BEGIN
select top 100 *
into #tempTable
from sys.all_parameters
exec Financial.dbo.child
END
GO
CREATE PROCEDURE child
AS
BEGIN
select *
into #tempTable --changing this temp table name will solve the issue
from sys.all_columns
update #tempTable
set column_id = 1 --this will throw an error when called from .Net code below
where collation_name is null --and this will throw an error when called from .Net code below
END
GO
И .Net:
System.Data.SqlClient.SqlCommand cmd = new SqlCommand("parent", SqlClient.SqlConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 0;
cmd.ExecuteNonQuery();