DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SqlClient.SqlCommandでパラメータを付けた場合と付けない場合の動作仕様の違いについて

  • 題名: SqlClient.SqlCommandでパラメータを付けた場合と付けない場合の動作仕様の違いについて
  • 著者: こど。
  • 日時: 2005/04/20 3:45:45
  • ID: 10544
  • この記事の返信元:
    • (なし)
  • この記事への返信:
    • (なし)
  • ツリーを表示
環境/言語:[Windows2000,VB.NET,Framework1.1]
分類:[.NET]

お世話になってます。

SqlClient.SqlCommandに関してなのですが、質問があります。
(SqlCommandで一時テーブルを使用するSQLを実行する際なのですが。)

まず・・・
一時テーブルを生成してデータを格納するSQL:SELECT * INTO #t1 FROM t1
それを利用する何らかの処理をするSQL:SELECT t2.* FROM #t1 INNER JOIN t2 ON #t1.code=t2.code
等といったSQL(変な例ですが。)を、
●同じコネクションを使用する複数のSqlCommandで実行した場合も、
●「;」で結合してひとつのSqlCommandで実行した場合も
正常に動作します。

ところが・・・
一つ目のSqlCommandにParameterCollectionでパラメータをひとつでも定義すると、
●「;」で結合せずに別々のSqlCommandで実行した場合のみ
二つ目のSQLでエラーになります。
具体的には「オブジェクト名'#t1'は無効です」となり、アクセスできません。

同じSqlCommand内で一時テーブルにアクセスする文を後ろにくっつけて実行すると問題なく扱えるの
で一時テーブルは一旦生成はされているので、その後に破棄されているようです。
Transact-SQLのSELECT文の説明によれば一時テーブルはストアドプロシージャ内で生成された場合、
終了時に自動的に破棄されるようなので、
動作を見た感じでは、
パラメータを定義した場合としていない場合とで、SQLの処理の方法が異なっているようです。
●定義しない場合:フラットなSQL文として、指定したままを使用。
●定義した場合:CommandTextの内容全体をひとくくりにした、変数定義付の、
ストアドプロシージャのようなものを生成、実行、終了後破棄しているような感じです。
(なお、パラメータは使用しなくても定義しただけでこの動作に変わります。)

このように推測はしたのですが、実際のところをご存知の方、いらっしゃいませんか。

(あ、DBMSは、実際にはMSDE2000SP3aです。)

DOBON.NET | プログラミング道 | プログラミング掲示板