読者です 読者をやめる 読者になる 読者になる

みんなのちからになりたい

コピペでブログラムつくっていきたい

東京とストアドっておっかないなって思いましたんで…

いまレガシー中のレガシーのAccess2000のシステムメンテやらされてて、Accessとかもう10年以上さわってなくて、しかもDBがSQLServer2008R2?とかいうこれまたSQLServerとかもう8年位さわってなくて、adp?とかいうDBはSQLServerだけど画面はAccessとかいう謎い構成になってて、東京の開発環境ってすごいなって思いましたんで…

で、なるべくVBAさわりたくないのでストアドでどうにかしようとガリガリ書いてるんだけど、バッドノウハウっぽいのにぶちあたってるのかSQLServerよく知らないからなのかわからないけど、はまったところが多々あったので何点かメモっていきたい。

ストアドで一時ファイルを使用する動的SQLを作ってexecぶちかましたとき、execが2発以上に分かれてると2回めのexecでその一時ファイルがみれない

例えばこういうの。

declare @sql varchar(max)

set @sql = 'select * into #temp1 from mytable'
exec(@sql)

set @sql = 'select * from #temp1'
exec(@sql)

これだと2回めのexecでは#temp1がみえないというか、セッション?をまたぐと消えるのかわからないけどとにかくなくなってる。
仕方ないのでこうするとできる。

declare @sql varchar(max)

set @sql = 'select * into #temp1 from mytable;'
set @sql += 'select * from #temp1'
exec(@sql)
一時ファイルをフォームに連結して、フォームからフィールドに値を入れようとしても入れられない

一時ファイルの仕様がよくわかってないからなんだろうけど、ストアドでは普通にCRUDできるのに連結すると更新とかまったくできず、まるで編集ロックがかかったようになる。
ぐぐってくと、主キーを設定しないと編集できないらしい。

適当に一時テーブルにIDとかのIDENTITY列作ってプライマリキーを設定したらできた。

create table #temp2(
  ID int IDENTITY(1,1) NOT NULL,
  mydate datetime
)
ALTER TABLE #temp2
    ADD CONSTRAINT PK_idid PRIMARY KEY (ID)
ストアドでゼロパディングする
RIGHT('00000'+ CONVERT(varchar, フィールド名), 5)

とかでできるし、CASTでもできる。

テーブル値関数便利

文字通りテーブルを返す関数。
条件縛ったテーブルとか返せて、テーブルと同じようにJOINとかで使える。

フォームとかレポートのレコードソースにストアドを指定したとき、引数をどこに設定したらいいかわからなくて混乱した

普通に入力パラメータってプロパティがあったので、そこに入れればよかった。

@year=2013, @month=12

リストボックスとかコンボボックスを一気に空にしたいと思ったら、Clearみたいなメソッドがなくて混乱した

一個ずつ消せということらしいです。

For i = lst.ListCount - 1 To 0 Step -1
    lst.RemoveItem (i)
Next

21世紀にもなっていまだにVB5とかAccess2000のシステムが普通に公的機関とかでXPで動いてたりするので、東京っておっかないなって思いましたんで…

というか、7のXPモードでVBのシステム動かして使ってるとことかあって、XP動かなくなるからマシンとOSリプレイスしましょうって案件が出ても、XPモードがあるかぎりレガシーシステムはこの先も永遠に生き残るのでは…