我正在创建一个临时表,并使用相同的命令和连接使用两个单独的语句进行填充.但是,如果我创建了在创建之前插入参数的表,我将收到一个“无效的对象名称”.如果我在创建后添加它,它可以正常工作.
临时表应该持续整个会话,所以当参数添加到命令对象时,我看不到什么重要.
失败:
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之后被清理,这说明了我在这里看到的内容.