SQL Server IF文内、一時テーブルへのINSERT INTOで メッセージ 2714
SQL Serverで、IF~ELSE内で、同名の一時テーブルへのINSERT INTOを実行しようとすると下記エラーメッセージが表示され、ストアドプロシージャを作成できない場合の対処方法。
サーバー : メッセージ 2714、レベル 16、状態 1、プロシージャ xxxx、行 62
データベースにオブジェクト名 '#temp1' が既に存在します。
[例1]
If @type = 'A'
select * into #temp1 from orders where type='A"
Else if @type = 'B'
select * into #temp1 from orders where type='B"
[例2]
If @type = 'A'
create table #temp1 (type int)
Else if @type = 'B'
create table #temp1 (type varchar(10))
【解決策】
一時テーブルなどのオブジェクトの作成は、IF文の前に行います。
[例1の場合]
create table #temp1 (type int, date datetime)
If @type = 'A'
insert into #temp1 select * from orders where type='A"
Else if @type = 'B'
insert into #temp1 select * from orders where type='B"
[例2の場合]
create table #temp1 (type int)
If @type = 'A'
alter table #temp1 alter column type int
Else if @type = 'B'
alter table #temp1 alter column type varchar(10)
保育園の発表会後の出来事
保育園の発表会。
2歳の息子は、先生方が作ったビニル製の帽子とチョッキとパンツの衣装を着て、歌い踊る。
ことになっていた。
しかし、衣装を着ることを徹底的に嫌がり、泣き喚き、ひっくり返って、抵抗し、結局「持って」舞台に上がることになった。
まだ2歳だから仕方がない。
発表会が終わり、ホールから外へ出ようとすると「寒いから」といって、本番でかぶらなかった帽子を自らかぶり、醜態を見せた先生に「かわいい」と言われた。
なんと皮肉なヤツだ。2歳とはそんなものなのだろう。
その本番中は着ることのなかった衣装は家に持ち帰ったのだが、気に入らなかったらしく、グジャグジャっとしていて、蝶ネクタイが取れてしまった。
それでもさらに破ろうとしていた。
「それ、先生が一生懸命作ったんだよ。」
「(私の息子が)寝ている間に作ったんだよ、きっと。」
「そんなことしていいの?」
と言うと、ハタと止まった。
そして今度はその衣装を着ると言い出した。
発表会の出番が終わって6時間余りが経過して、ようやく初めて衣装を全部身につけた。
「それじゃ、写真を撮って先生に見せよう」
というと、息子はニッコリ笑ってポーズを見せた。
ASP 配列 SPLIT
例えば、PREF に次の値が入っているとする。
PREF = "東京都","神奈川県","大阪府","福岡県"
カンマ区切りで配列に渡す。
ArrBox = Split(PREF,",")
配列からデータを呼び出す。0(ゼロ)から始まる。
response.write ArrBox(0)
→「東京都」と表示される。
response.write ArrBox(1)
→「神奈川県」と表示される。
response.write ArrBox(2)
→「大阪府」と表示される。
SQL Server ストアドプロシージャ
SQL Server で ストアドプロシージャ の作成、変更方法を解説します。
【確認方法:ストアドプロシージャの名前】
sp_help
作成済みのストアドプロシージャの名前を確認できます。
[Object_type]が「stored procedure」のものです。
【確認方法:ストアドプロシージャの内容】
sp_helptext ストアドプロシージャ名
[例]
sp_helptext 'master.dbo.sp_who'
【作成方法(入力パラメータなし)】
create proc[edure] ストアドプロシージャ名
as
内容
[作成例]
create proc sp_test
as
select count(*) from table_name
[実行例]
execute sp_test
【作成方法(入力パラメータあり)】
create proc[edure] ストアドプロシージャ名
@parameter data_type = default
as
内容
[作成例]
create proc sp_test
@id int = 1
as
select count(*) from table_name where id=@id
[実行例]
execute sp_test 2
Oracle バックアップ
Oracleのデータベース管理から離れて2年。結構忘れてしまっていました。当時は寝ながらでもできたんですがねぇ。。
他は何もわからなくとも、とにかくバックアップとリストアだけはできないとDBAとして務まりませんから、復習の意味でまとめていきます。
【バックアップ対象】
Oracleでバックアップを取っておかなければならないものは以下の通り。
・TABLESPACE
・REDOログファイル
・CONTROLファイル
・初期化パラメータファイル
【バックアップ対象確認方法】
バックアップを取るには、それぞれ、ファイルがどこにあるのか確認しなければならない。
・TABLESPACE
select file_name,file_id,tablespace_name from dba_data_files;
・REDOログファイル
select * from v$logfile;
・CONTROLファイル
select * from v$controlfile;
・初期化パラメータファイル
create pfile='(path)' from spfile;
(これでバックアップにもなる)
【バックアップ:コールドバックアップ】
データベースを停止させ、データファイルをOSのコピーコマンドを使って行う。
1) Oracleを停止する。
shutdown immediate
(ユーザーのセッションが切れるのを待たずに強制終了)
2) バックアップ対象(データファイル)をOSのコマンドを使ってコピーする
3) Oracleを開始する。
start open
【バックアップ:オンライン・ホットバックアップ】
1) REDOログファイルからデータファイルに書き込まれていないデータを極力なくす
alter system switch logfile;
をREDOログファイルの数分実行
2) テーブルスペースごとにバックアップ
alter tablespace SYSTEM begin backup;
hot start /wait xcopy (datafile_path) (backup_path) /E /H /Y
alter tablespace SYSTEM end backup;
3) CONTROLファイルのバックアップ
alter database backup controlfile to '(backup_path)';
【バックアップ:オフライン・ホットバックアップ】
オンライン・ホットバックアップと異なるのは 2) だけで他は同じ。
2) テーブルスペースごとにバックアップ
alter tablespace SYSTEM offline;
hot start /wait xcopy (datafile_path) (backup_path) /E /H /Y
alter tablespace SYSTEM online;
SQL Server データ型の変換
SQL Server でデータ型を変換するファンクションは、2通つある。
CAST と CONVERT である。
CAST の書式は、
CAST(データ型を変換したい値 as 変換後のデータ型)
例えば、このように使う。
select CAST(order_date as varchar(20)) from orders
私がよく使うのは、月間の注文数を一覧表示したいときなどである。
GROUP BY と組み合わせて使うと、カーソルは必要ない。簡単なクエリで済む。
これである。
select Left(CAST(order_date as varchar(10)),7), count(*) as 注文数 from orders group by Left(CAST(order_date as varchar(10)),7)
order_date 列は、 datetime データ型であり、注文日時が保存されている。
それを、CAST(order_date as varchar(10)) として、年月日を文字列に変換するのである。
ただし、ここで1つ注意が必要である。
確か、OSの地域の設定だったと思うが、datetime型を文字列に変換した場合、
「2010/01/01」となる場合や、「01 01 10」となる場合があるので、あらかじめ確認が必要である。
今回の例は、「2010/01/01」と表示されることを前提としている。
CONVERT はデータの書式を指定できる。
例えば、convert(varchar(10),order_date, 111) とすると、yy/mm/dd 「10/01/01」と表示される。
そこで、先ほどの月間注文数を一覧表示する例は、このように書ける。
select Left(convert(varchar(10),order_date, 111),7), count(*) as 注文数 from orders group by Left(convert(varchar(10),order_date, 111),7)
(参考)
Oracle SQL*Plus で csvファイルの作成(エクスポート)
Oracle の SQL*Plus を使ってcsvファイルを作成する方法です。
Oracle から SQL Server へあるテーブルを丸ごとコピーする必要がありました。
しかし、今回1回限りのことですし、Oracle Client をSQL Server がインストールされているサーバーにコピーするのも面倒なので、SQL*Plus を使ってcsvファイルを作成することにしました。
SQL*Plus で下記を実行します。
set echo off
set heading off
set termout off
set pause off
set pagesize 0
set linesize 1000
set trimspool on
set feedback off
spool C:\data_exp.csv
SELECT '"'||id||'","'||name||'","'||zip||'","'||address||'"' FROM customers;
spool off
結果はこのようになります。
SQL> SELECT '"'||id||'","'||name||'","'||zip||'","'||address||'"' FROM customers;
"1","小山内","230-0021","神奈川県"
"2","田中,裕","117-0002","東京都"
"3","鈴木","420-0033","千葉県"
この結果の1行目を下記のように変更すれば、SQL Server にインポートする際に、1行目を列名としてそのまま使うことができます。
"id","name","zip","address
また、各列は「"」で囲まれていますから、2行目の「田中,裕」というデータがあったとしても、列の区切りだと判断されず、SQL Server にインポートするときにエラーになったりしません。
もし、この方法で作成したcsvファイルからうまくインポートできない場合は、マイクロソフト エクセルなどでcsvファイルを開き、再度csvファイルとして保存すると、うまくインポートできる場合があります。
保育園の発表会前の出来事
今日は娘と息子が通う保育園の発表会。
例年通り、コンサートホールを貸切って行う。自宅から歩いて15分の場所にある。
10:00前に入ればよいから、9:30に家を出発しても十分間に合う。
9:00ごろ、まだ少し時間があったから、娘と息子の出番を確認しようとプログラムを見ていた。
そうしたら、見慣れない施設の名前が記載されている。
「え?あのホールの名前、正式名称はこれだったの?それとも変わったの?」
と妻に尋ねながらその紙をジーと見る。
そんなわけはない。
ホールへのアクセスが書いてあるが最寄り駅が全く違う。
疑いながらよく見てみると、いつもの場所と違う。
車で45分くらいはかかる場所だ。
「場所が違うぞー!」
と、カオスに陥りそうなのを踏みとどまりながら、慌てて、しかし慎重に、一気に支度をして家を出て車に乗り込んだ。
こういう時は致命的な忘れ物や、思わぬアクシデントに巻き込まれる可能性がある。
頭をフル回転させて「あれは持ったか?」「本当にあの場所でいいのか?」などと出発前のチェックをしながら気持ちを落ち着けた。
9:15に車を出した。
開演の10:00に到着見込みである。5分程度ならacceptableだ。だがそれ以上は厳しい。
事故を起さないように、路を間違えないように車を走らせた。
駐車場を見つけられなかったときの対策も練りながら。
子どもたちはせっかく発表会の練習をたくさんしたのに、遅れたりしたら悪い。
しかし、子どもたちはのん気なものである。
両親がこんなに焦っているのにマイペース。
後ろの座席で歌を歌っていた。
土曜日の朝ということもあり、見込みより早く、9:45に近くの駐車場に着いた。
しかし、前の車が駐車場入り口のバーの前で止まったまま動かない。
「満車でバーが開かないのか?」
広い駐車場を見てみると確かに空きがなさそうだ。
同じ発表会に参加する人の車でいっぱいなのかもしれない。
「仕方がない、ここで妻と子どもを下ろし、別の駐車場を探すか」
そう思っていたら、その止まっていた車のドアが開き、人が出てきた。
そして、駐車券を発券機から受け取った。
車を止めた位置が発券機から遠すぎて、まごついていただけだったのである。
まだ油断はできない。今入っていた車で満車になってしまうかもしれない。
祈りながらソーっとバーに近づけ、発券機のボタンを押した。
そしたら、駐車券がスッと出てきた。
「あぁ、助かった。」
ホールには5分前に到着。
難なく参加することができた。
もし、ホールが違うことに気づかず、間違って行っていたら、確実にアウトだった。
本当に危なかった。
確認は大切だ。
2010年の政治と経済-キッコーマンCEO 茂木友三郎
キッコーマンCEO 茂木友三郎氏の「2010年の政治と経済」と題したスピーカーズコーナー・トウキョウに参加。
全くの同感。講演後のディスカッションでどなたかが仰ってましたが、本当に「基本に忠実」。
だから本質から逸れない。そう思いました。
2010年の日本経済の課題と、それらに対する経営者と政治家の求められる役割をお話された。
簡単にまとめると次の通り。
【2010年日本経済の課題】
デフレからの脱却
成長を始める
これら2つはデータが示している。
物価は、1999年から、着実に下落を続けている。
GDPはこの20年間ほぼ変わらない。そうこうしている内に、総GDPは中国に今年追い越される見込みである。
だが、一番残念なことは、国民1人あたりの名目GDPの相対的下落である。これはつまり1人あたりの所得、生活レベルに置き換えられる。それが世界18位。
アジアではシンガポールに抜かれている。購買力平価を加味すれば、日本はシンガポールよりも貧しい国民といえる。
以前もブログに書いたと思うが、シンガポールの人は、あの憧れの経済大国日本を追い越し、アジアで一番優秀になったと自負している。と、過去に一緒に仕事をしたシンガポール人の態度から察したことがある。
【経営者の課題】
日本経済の課題に対処するために、企業経営者は、
安易な価格競争に走らない。
需要の創造(顧客創造)をする。
ことである。
デフレが続けば、タンス預金でも価値が増加するわけで、リスクマネーが増えない。
だから、ベンチャー企業などへの投資もほとんど行われず、企業の新陳代謝も進まない。
すると、新しい商品やサービスも生まれにくい。
消費者はお金を使う理由が減る。
給料が減る。
価格を下げる。
お金が世の中に出回らない。
企業の新陳代謝が進まない。
新しい商品やサービスも生まれにくい。
とデフレスパイルを増長させてしまう。
安易な価格競争に走るべきではない、と私も思う。やはり経営者が、自身の企業が提供する商品やサービスの価値を適切に評価し、適切な価格で提供すべきである。
原価計算から価値を計算するのではなく、顧客の利便性から価値を計算することがポイントである。
さもないと、従業員は本当に、「働けど働けど我が暮らし楽にならず」が続くことになる。
次に、需要の創造 であるが、これは1番大事だが、1番難しい。
最近の例では、
- ネットブック(スペックの低い持ち運びに便利なセカンドPC)
- 3D映画
- エコカー
などであろう。
需要の創造は、言い換えれば、「顧客への新しい提案」ということになる。
これまでの商品やサービスを見直し、顧客にとって都合のよい機能(または方法)を提案することである。
競合と同じ方法ではなく、異なる方法で新しい価値を提供するのである。
これは成長戦略を取るならば、当然。だが楽ではないから難しい。
次回は、ドラッカーの書籍の和訳で有名な上田惇生氏。
ドラッカーも顧客の創造を強く主張していた。そのあたりの話しを聞けるといいな、と思う。
興味のある方はこちら
SQL Server クエリの結果をテーブルに保存する
SQL Server で、
■select した結果をテーブルに保存するには
「select * from source_table」の間に「into new_table」を書けば、selectした結果が new_table に保存される。
select * into new_table from source_table where ...
このとき、new_table が既に存在すると失敗するので注意。
■ストアドプロシージャを実行した結果をテーブルに保存するには
まず、結果を保存するテーブルを作成する。このとき、sp_spaceused の実行結果と同じ列数、データ型でテーブルを作成する。
次に、これを実行する。
insert into new_table execute sp_procedure
例えば、sp_spaceused table_name の実行結果を保存したい場合は、
tablesize テーブルを作成してから、
insert into tablesize(name, rows, reserved, data, index_size, unused) exec sp_spaceused table_name
を実行する。