人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL SERVER2000初心者です。

下記のようなテキストファイルのデータを、SQL Serverのテーブルにコピーしたいです。
そのテーブルは【商品コード】【登録日】の2フィールドで、
【商品コード】にテキストファイルのデータを、【登録日】
に登録した日付を入力したいのです。

<C:\DATA.TXT>(テキストファイル)
A111
A222
A333


<SHOHIN_TABLE>(商品テーブル)
SHOHIN_CODE(商品コード)
TOUROKUBI(登録日)

方法をご存知の方、教えていただけないでしょうか。
よろしくお願いします。

●質問者: db_Magician
●カテゴリ:コンピュータ
✍キーワード:SQL Server コピー コード テキスト データ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● daggersherkee
●10ポイント

Enterprise Managerを起動して

ツールから

データ変換サービスより「データのインポート」を

選択し、

データソースを「Text File」に設定して

ファイル名を指定し「次へ」

ファイルの読み込みについて指定した後

変換先をデフォルトのままサーバと

データベースを指定してインポートできます。

http://www.yahoo.co.jp

◎質問者からの返答

回答ありがとうございます。

確かにこの方法でインポートはできるのですが、

登録日を入力できないことと、この操作をジョブ化

したいので、できればSQL文など、他の方法を教えていただけると

嬉しいです。

最初から書いておくべきでしたね。

質問に不足があり、申し訳ありません。


2 ● kurukuru-neko
●10ポイント

1.?4.を行うisqlとか作成してみては

1. CREATE TABLEで一時テーブルを作成

2. BULK INSERT 一時テーブルにインサート

3. UPDATEで 一時テーブルの日付を変更

4. INSERTで一時テーブルを保存したいテーブルに追加

BULK INSERT フォーマット ファイルの使用

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

http://www.k3.dion.ne.jp/~reestr/sqldml_bulk.htm

嗜好は違いますがDTS(Data Transformation Service)

http://www.microsoft.com/japan/msdn/sqlserver/columns/dts/dts1.a...

◎質問者からの返答

回答ありがとうございます。

この方法は私も考えましたが、2フィールドあるテーブルに

1フィールド分のデータのみインサートする方法が

分かりませんでした。

bcpフォーマットファイルというもので細かく設定できるのですね…

これはどのようにして作成すればいいのでしょうか…??

もしよろしければ教えていただけないでしょうか。


3 ● kurukuru-neko
●30ポイント ベストアンサー

一時テーブルを使うなら

フィールドが少ないデータ ファイルの使用

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

面倒であれば

1フィールドのテーブルを作成してbulk copy

後alter table でカラムを追加すれば済みます。

◎質問者からの返答

たびたびありがとうございます。

今日はもう遅いので、明日試してみたいと思います。


#2番、3番の回答を組み合わせて無事解決できました。

ありがとうございました。


4 ●
●45ポイント

スクリプトでテキストからSQLを生成し、それを読み込んで実行すれば良いと思います。

(Perlが全く分からない場合はちょっと大変かもしれませんが、LL言語は使いこなせると非常に便利なので、得意でない場合もこれを機に勉強してみても良いと思います。)

#! /usr/bin/perl

use strict;
use warnings;

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
my $today = sprintf("%04d%02d%02d", $year + 1900, $mon + 1, $mday);

# TOUROKUBIがVARCHAR型の場合用の文字列生成
my $register_date = sprintf("%04d/%02d/%02d", $year + 1900, $mon + 1, $mday);

# 読み込むファイルの指定
my $infile = "./data.txt";
my $outfile = "./insert_shohin_table_$today.sql";

open(IN, $infile) or die "Can't open '$infile' : $!";
open(OUT, ">$outfile") or die "Can't open '$outfile' : $!";

# SQLの生成 ($outfileで指定したファイルに書き込み)

while (<IN>) {
 chomp;
 print OUT "INSERT INTO shohin_table VALUES ('$_',GETDATE());\n" if not /^\s*$/ ;
# TOUROKUBIがVARCHAR型のフィールドの場合、上記をコメントアウトし、下記を有効にする
# print OUT "INSERT INTO shohin_table VALUES ('$_','$register_date');\n" if not /^\s*$/ ;
}

close(OUT);
close(IN);

上記のスクリプトを

perl sql_generate.pl

などとして実行するとSQL文を含んだテキストファイルが生成されます。

A111
A222
A333

上記のような場合、テキストファイルを元にSQLを生成すると

INSERT INTO shohin_table VALUES ('A111',GETDATE());
INSERT INTO shohin_table VALUES ('A222',GETDATE());
INSERT INTO shohin_table VALUES ('A333',GETDATE());

このような内容の insert_shohin_table_20061205.sql というファイルが生成されます。

TOUROKUBIがdatetime型のフィールドであれば、GETDATE()でINSERT時の日時をTOUROKUBIに設定できます。

もしもTOUROKUBIがVARCHAR型、あるいはCHAR型の場合、どのような文字列としてセットしたいのかに合わせてスクリプト上で文字列を生成してしまっておけば良いと思います。

上述のスクリプトでは、YYYY/MM/DD 形式での文字列にも対応できるようにしておきました。

参考になれば幸いです。

[参考URL]

◎質問者からの返答

丁寧な回答、ありがとうございます。

インサート文を生成するのですね。

perlが分からないのでちょっと厳しいですが、

覚えれば確かに便利そうです。

ぜひ参考にさせていただきます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ