一時テーブルを作成し、同じコマンドと接続を使用して 2 つの個別のステートメントを設定しています。ただし、作成前にパラメーターを挿入してテーブルを作成すると、「無効なオブジェクト名」が表示されます。作成後に追加すると、正常に動作します。
一時テーブルはセッション全体で持続するはずなので、パラメーターがコマンド オブジェクトに追加されたときに何が問題になるのかわかりません。
失敗:
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 プロファイラーはこれをさらに明らかにします。
コマンドにパラメーターがある場合、基になるコードは "exec sp_executesql" を発行しています。パラメータがクリアされると、基になるコードはより直接的な「CREATE TABLE」を発行します。一時テーブルは、sp_executesql の後にクリーンアップされます。これが、ここに表示されている内容を説明しています。
私にとって、これは SqlCommand (または関連する) コードのバグですが、説明が得られたので先に進みます。