«Недопустимый столбец» при вызове из другой хранимой процедуры из .Net - PullRequest
0 голосов
/ 22 мая 2019

Я добавил вызов к хранимой процедуре SQL Server (назовем его «дочерний») в конце существующей хранимой процедуры («родительский»). И дочерний, и родительский (который также включает в себя дочерний) успешно запускаются при запуске из SSMS как под моей учетной записью, так и под учетной записью службы, на которой запущены procs в рабочей среде.

Когда я запускаю дочерний процесс непосредственно из приложения .Net, используя вызов SqlClient.SqlCommand.ExecuteNonQuery (), он запускается успешно. Однако, когда я запускаю parent, используя то же соединение, он завершается с ошибкой «Invalid Column 'X'» из дочернего элемента.

Вещи, которые я подтвердил:

  • Каждая ссылка на X в дочернем элементе связана с соответствующим представлением или таблицей, и возвращаемое исключением «Номер строки» на самом деле не является строкой запроса, включающей X.

  • Все таблицы / представления содержат этот столбец

  • Дочерний процесс успешно выполняется сам по себе, и в большинстве случаев даже внутри родительского процесса

  • Все учетные записи имеют надлежащие разрешения для выполнения, выбора и вставки данных там, где они нужны

  • Родитель уже запускает другие хранимые процедуры из того же Database.schema, что и дочерний

Почему этот процесс выдает ошибку только при вызове из приложения .Net?

1 Ответ

0 голосов
/ 22 мая 2019

После просмотра трассировки Профилировщика, первая ошибка говорила, что одна из временных таблиц была недопустимым объектом.Я явно создал таблицу в процедуре вместо использования оператора «Вставить в», и это исправило ее.

Странно, как этого не произошло ни с одним из других операторов «вставки» в любом из процедур.

Редактировать:

После более подробного изучения, это происходит потому, что и у родителя, и у потомка временная таблица имеет одно и то же имя, а дочерний процесс обновляет свою временную таблицу любыми столбцами, которые нене существует во временной таблице родителя.

Игрушечный код:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...