Я создаю временную таблицу и заполняю ее двумя отдельными операторами, используя ту же команду и соединение. Тем не менее, я получаю "Недопустимое имя объекта", если я создаю таблицу с параметром, вставленным перед созданием. Если я добавлю его после создания, он отлично работает.
Временная таблица должна длиться весь сеанс, поэтому я не вижу, что имеет значение, когда параметр добавляется к объекту команды.
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 (или связанном) коде, но поскольку теперь у меня есть объяснение, я могу двигаться дальше.