WEBエンジニア社長のブログ -16ページ目

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通つある。

CASTCONVERT である。


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)


(参考)

マイクロソフト msdn

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
を実行する。