Подтвердить что ты не робот

"Недопустимое имя объекта" для временной таблицы при использовании команды с параметрами

Я создаю временную таблицу и заполняю ее двумя отдельными операторами, используя ту же команду и соединение. Тем не менее, я получаю "Недопустимое имя объекта", если я создаю таблицу с параметром, вставленным перед созданием. Если я добавлю его после создания, он отлично работает.

Временная таблица должна длиться весь сеанс, поэтому я не вижу, что имеет значение, когда параметр добавляется к объекту команды.

FAILS:

        using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TEST;Integrated Security=True;"))
        using (SqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();

            cmd.Parameters.Add(new SqlParameter("@ID", 1234));

            cmd.CommandText = "CREATE TABLE #Test (ID INT NOT NULL PRIMARY KEY, I INT NOT NULL)";
            cmd.ExecuteNonQuery();

            cmd.CommandText = "INSERT INTO #Test VALUES (@ID, 1)";
            cmd.ExecuteNonQuery();

            ..... more code that uses the table

        }

РАБОТЫ:

        using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TEST;Integrated Security=True;"))
        using (SqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();

            cmd.CommandText = "CREATE TABLE #Test (ID INT NOT NULL PRIMARY KEY, I INT NOT NULL)";
            cmd.ExecuteNonQuery();

            cmd.Parameters.Add(new SqlParameter("@ID", 1234));

            cmd.CommandText = "INSERT INTO #Test VALUES (@ID, 1)";
            cmd.ExecuteNonQuery();

            ..... more code that uses the table

        }

изменить

SQL Profiler проливает больше света на это.

Если команда имеет какие-либо параметры, базовый код выдает "exec sp_executesql". Если параметры очищены, базовый код выдает более прямой "CREATE TABLE". Таблицы Temp очищаются после sp_executesql, что объясняет, что я вижу здесь.

Для меня это будет ошибкой в ​​SqlCommand (или связанном) коде, но поскольку теперь у меня есть объяснение, я могу двигаться дальше.

4b9b3361

Ответ 1

Проблема в самом деле в выражении exec sp_executesql. Когда ADO обнаруживает, что есть параметры, объявленные в sqlCommand, по умолчанию используется "sp_executesql" вместо "exec". Но в этом случае первая команда создает таблицу TEMPORAL, и, как известно, временные таблицы действительны только внутри хранимой процедуры (sp_executesql) и удаляются при выходе. Поэтому, следовательно, второй оператор INSERT более не действует в первом примере кода. Во втором, временная таблица создается успешно, и оператор insert выполняется нормально. Надеюсь, что это поможет.

Ответ 2

Я подозреваю, что состояние первого выполнения не выполняется, потому что оно настаивает на том, что каждый параметр должен использоваться.