テーブルは作りたくないけど、SQLの実行中だけ一時的に退避させておくテーブルが欲しい、


テーブル内のデータのコピーをとり、コピーで加工がしたい等の永続的ではなく一時的にテーブルを利用したい場合に一時テーブルを利用します。


一時テーブル以外にも変数テーブルもある。・・・が今回は一時テーブルについて書きます。


まずはソースから


-- 一時テーブルの作成
CREATE TABLE #TemporaryTable (
  tid INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
  memo1 VARCHAR(255),
  memo2 VARCHAR(255)
)

-- 一時テーブルにデータを追加
INSERT INTO #TemporaryTable(memo1) 
values('INSERTED ' + cast(getdate() as varchar(255)))
INSERT INTO #TemporaryTable(memo1) 
values('INSERTED ' + cast(getdate() as varchar(255)))
INSERT INTO #TemporaryTable(memo1) 
values('INSERTED ' + cast(getdate() as varchar(255)))

-- 格納域
declare @tid int

-- カーソル宣言
declare temp_cursor cursor fast_forward for
SELECT tid FROM #TemporaryTable

-- カーソルオープン
open temp_cursor

-- カーソル移動
fetch next from temp_cursor into @tid

-- カーソルが読み取れなくなるまで
while (@@fetch_status = 0)
begin
  -- 取得したtidでデータ更新
  update #TemporaryTable 
  set 
    memo2=
    '[ ' + cast(@tid as varchar(255)) 
    + ' ] 回目のINSERT結果です。' 
  where tid=@tid
  -- カーソル移動
  fetch next from temp_cursor into @tid
end

-- カーソルを閉じる
close temp_cursor
-- カーソルを解放
deallocate temp_cursor

-- 追加、更新したテーブルを表示
select * from #TemporaryTable

-- 必要なくなった一時テーブルを削除
drop table #TemporaryTable




これをクエリアナライザ等で実行すれば実行されます。


しかもテーブルは残りません。


普通のCREATE TABLEと文法は同様です。唯一違うのはテーブル名の前に”#”が付いていることです。


これはローカル一時テーブルといい、作成した人のみが利用可能です。


よって、セッションを分ければ同名のテーブルが作成可能です。


またセッションがなくなればテーブルも削除されます。


”##”が二つ付いているとグローバル一時テーブルといいます。


この場合は、全部のセッションで共通して利用が可能になります。


よって、他のセッションで作成されている場合は同名のテーブルの作成は不可能です。


アクセスしている全セッションがなくなりますと、テーブルも削除されます。


カーソルに関しましては、declareでカーソルを作成します。


fast_forwardと記載されている箇所は、カーソルの種類を指定してます。


次に、カーソルで開くためのSQL文を記載します。


定義が完了したら、openで開き、fetchで取得し、closeで閉じます。


最後に、deallocateで確保した領域を解放します。

リモートデスクトップ先のファイルを取得したいと思うときはありませんか?


知ってる人はもちろん、「そんなのあーすればできるじゃん」って思うかもしれませんが、はいっできます。


考え付く限りですと、


・FTPサーバにファイルをアップする


・共有フォルダを作成し、\\PC 名\共有フォルダ名でアクセスする


・メールで転送する




ありますね。


ただ、どれも一手間も二手間もかかる作業です。


そこで!リモートデスクトップ接続時に自動で接続先にネットワークドライブを作成する方法が設けられてます。


リモートデスクトップでは起動時のデフォルトでは、ボタン4つと入力可能なコンボボックスが1個用意されているだけです。


が、ボタン4つのうちの一つ「オプション」をクリックすると、設定できる項目が一気に増えます。


ローカルリソースタブのディスクドライブにチェックをつけて接続し、接続先のマイコンピュータを開くとドライブが増えてます。


ただし、ADSL等上り速度が遅いと開くのに時間がかかるので注意!


上記方法はXPProでの設定方法となっています。



ちなみにVISTAですと、アクセスできるドライブも設定できます。


今まで余計に手間をかけていた人は、この方法で作業効率を1%でも上げていきましょう。

利用者の入力情報によって、動的にインスタンスを生成するクラスを変更したい場合の方法を記述します。


例えば、実行時にの第1引数に指定したクラス名をインスタンス化する場合

public class Class1{
}

public class Class2{
}

public class Program{
  public static void Main(string [] args){
    System.Reflection.Assembly assembly = 
        Assembly.GetExecutingAssembly();
    object inst = assembly.CreateInstance(
      args[0]
      ,false
      ,System.Reflection.BindingFlags.CreateInstance
      ,null
      ,new object[]{}
      ,null
      ,null);
    if (inst == null){
      Console.WriteLine("クラス{0}が見つかりません。"
        , args[0]);
    }
    else {
      Console.WriteLine(inst.ToString());
    }
  }
}


GetExecutingAssemblyでは現在実行しているアセンブリを取得します。


取得したアセンブリのCreateInstanceでインスタンスを生成します。


この際の第一引数がクラス名になります。名前空間をつけた絶対名にしてください。


第4引数では、コンストラクタに渡す引数を指定します。

(オブジェクト型の配列で渡します)


何か渡したい場合は


new object[]{10,10,"abc"}


のように書けば引数を渡すことが可能です。


これを応用すれば動的なインスタンス生成も可能です。